วิธีออกจากแอป java จากภายในโปรแกรม


145

วิธีที่ดีที่สุดในการออกจากแอปพลิเคชัน Java ด้วยรหัสคืออะไร


1
อืมมม ฉันคิดว่าคำถามอาจกว้างเกินไป ออกจากสถานการณ์ใด?
Allen George

3
ปล่อยให้เธรดที่ไม่ใช่ภูตของคุณเสร็จตามปกติหรือไม่
Thorbjørn Ravn Andersen

คำตอบ:


192

คุณสามารถใช้ได้ System.exit()เพื่อวัตถุประสงค์นี้

อ้างอิงจากเอกสาร Java 8 ของ oracle:

public static void exit(int status)

ยุติ Java Virtual Machine ที่รันอยู่ในปัจจุบัน อาร์กิวเมนต์ทำหน้าที่เป็นรหัสสถานะ โดยการประชุมเป็นรหัสสถานะภัณฑ์บ่งบอกเลิกผิดปกติ

วิธีการนี้เรียกวิธีการออกในคลาสรันไทม์ วิธีนี้จะไม่ส่งคืนตามปกติ

การโทรSystem.exit(n)นั้นเทียบเท่ากับการโทรได้อย่างมีประสิทธิภาพ:

Runtime.getRuntime().exit(n)


102
System.exit(0);

"0" ช่วยให้ใครก็ตามที่เรียกว่าโปรแกรมของคุณรู้ว่าทุกอย่างก็โอเค อย่างไรก็ตามหากคุณออกจากข้อผิดพลาดคุณควรSystem.exit(1);หรือด้วยหมายเลขที่ไม่ใช่ศูนย์อื่นที่สอดคล้องกับข้อผิดพลาดเฉพาะ

นอกจากนี้ตามที่คนอื่น ๆ ได้กล่าวถึงทำความสะอาดก่อน! ที่เกี่ยวข้องกับการปิดไฟล์และเปิดแหล่งข้อมูลอื่น ๆ


ฉันคิดว่ามันเป็น System.exit (1)?
AFK

14
ดังที่ Chris ระบุSystem.exit(1)(หรือหมายเลขอื่น ๆ ) คือถ้าคุณต้องการระบุว่ามันปิดเนื่องจากข้อผิดพลาด System.exit(0)ระบุว่าโปรแกรมปิดตามปกติ นอกจากนี้คุณยังสามารถเปลี่ยน 1 เป็นหมายเลขใดก็ได้ที่คุณต้องการจากนั้นเมื่อคุณเรียกใช้แอปพลิเคชันของคุณจากสคริปต์คุณสามารถตรวจสอบว่ามีข้อผิดพลาดหรือไม่
StormPooper

10

System.exit(int i)จะใช้ แต่ผมจะรวมไว้ภายในทั่วไปมากขึ้นshutdown()วิธีการที่คุณจะรวมถึง "การทำความสะอาด" ขั้นตอนเช่นเดียวกับการปิดการเชื่อมต่อซ็อกเก็ตอธิบายไฟล์, แล้วSystem.exit(x)ออกด้วย


6

System.exit() มักจะไม่ใช่วิธีที่ดีที่สุด แต่ขึ้นอยู่กับใบสมัครของคุณ

วิธีปกติในการสิ้นสุดแอปพลิเคชันคือออกจากmain()วิธีการ สิ่งนี้ไม่ทำงานเมื่อมีเธรดที่ไม่ใช่เดมอนอื่นทำงานอยู่ตามปกติสำหรับแอปพลิเคชันที่มีส่วนต่อประสานผู้ใช้แบบกราฟิก (AWT, Swing ฯลฯ ) สำหรับโปรแกรมเหล่านี้คุณอาจหาวิธีที่จะสิ้นสุดการวนรอบเหตุการณ์ GUI ที่ (ไม่ทราบว่าเป็นไปได้ด้วย AWT หรือสวิง) System.exit()หรือวิงวอน


4

การใช้dispose();เป็นวิธีที่มีประสิทธิภาพมากในการปิดโปรแกรมของคุณ

ฉันพบว่าการใช้System.exit(x)รีเซ็ตบานหน้าต่างการโต้ตอบและสมมติว่าคุณต้องการข้อมูลบางอย่างที่นั่นข้อมูลทั้งหมดจะหายไป


3

ฉันเห็นด้วยกับจอนให้แอปพลิเคชันของคุณตอบสนองต่อบางสิ่งและโทรหา System.exit ()

ต้องแน่ใจว่า:

  • คุณใช้ค่าการออกที่เหมาะสม 0 คือทางออกปกติสิ่งอื่นบ่งชี้ว่ามีข้อผิดพลาด
  • คุณปิดสตรีมอินพุตและเอาต์พุตทั้งหมด ไฟล์การเชื่อมต่อเครือข่าย ฯลฯ
  • คุณเข้าสู่ระบบหรือพิมพ์เหตุผลในการออกโดยเฉพาะอย่างยิ่งถ้ามันเป็นเพราะข้อผิดพลาด

2

คำตอบคือ System.exit () แต่ไม่ใช่สิ่งที่ดีที่จะทำเช่นนี้ยกเลิกโปรแกรม การทำความสะอาดทำลายสิ่งที่คุณตั้งใจทำจะไม่เกิดขึ้น


1

มีสองคำตอบง่ายๆสำหรับคำถามนี้

นี่คือ "วิธีการระดับมืออาชีพ":

//This just terminates the program.
System.exit(0);

นี่เป็นวิธีที่งุ่มง่ามมากขึ้น:

//This just terminates the program, just like System.exit(0).
return;

System.exit(0); return;ก็ดีเช่นกันการส่งคืนจะป้องกันโค้ด ruther ใด ๆ ที่จะทำงานก่อนที่ระบบจะสามารถออกได้มิฉะนั้นคุณต้องมีการตั้งค่าสถานะ (..i.e. if (!called_exit) { further code after exit statement }
ycomp

-1
Runtime.getCurrentRumtime().halt(0);

1
ดีกว่า: Runtime.getRuntime (). halt (0); ทำงานอย่างสมบูรณ์แบบสำหรับฉันภายใน Scala!
แกร์ฮาร์ดฮาเกอร์เกอร์

@ GerhardHagerer แต่ถ้าคุณไม่ได้รับ runti ปัจจุบันฉัน?
Dude Bro

1
จาก Javadoc สำหรับhalt: "วิธีนี้ควรใช้ด้วยความระมัดระวังอย่างมากซึ่งแตกต่างจากexitวิธีการวิธีนี้จะไม่ทำให้ตะขอสำหรับปิดระบบเริ่มทำงานและไม่ได้เรียกใช้ finalizers ที่ไม่ถูกเรียกใช้หากเปิดใช้งาน finalization-on-exit ได้รับการเริ่มต้นแล้ววิธีนี้จะไม่รอให้ฮุคปิดเครื่องหรือ finalizers ทำงานเพื่อให้งานเสร็จ " ในระยะสั้นที่คุณไม่ควรต้องใช้คุณควรต้องการhalt exit
Erwin Bolwidt

-1

System.exit()จะทำในสิ่งที่คุณต้องการ แต่ในสถานการณ์ส่วนใหญ่คุณอาจต้องการออกจากเธรดและปล่อยให้เธรดหลักยังมีชีวิตอยู่ ด้วยการทำเช่นนั้นคุณสามารถยกเลิกงานได้ แต่ยังคงสามารถเริ่มงานใหม่ได้โดยไม่ต้องรีสตาร์ทแอพ



-3

สิ่งนี้ควรทำในวิธีที่ถูกต้อง:

mainFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
mainFrame.addWindowListener(new WindowListener() {

@Override
public void windowClosing(WindowEvent e) {
    if (doQuestion("Really want to exit?")) {
      mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      mainFrame.dispose();
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.