黑马程序员技术交流社区

标题: 为什么System.exit(-1)前面这条语句执行没有效果呢? [打印本页]

作者: 赵熠东(赵东东)    时间: 2013-5-1 01:14
标题: 为什么System.exit(-1)前面这条语句执行没有效果呢?
本帖最后由 赵熠东(赵东东) 于 2013-5-2 09:36 编辑

下面是代码片段:
  1. try {
  2.         //加载驱动程序
  3.         Class.forName("sun.jdbc.odbc.JdbcOdbcDriverError"); //故意出错,测试catch语句
  4. } catch (ClassNotFoundException e1) {
  5.         //延时关闭窗口
  6.         taInfo.setText("无法加载jdbc驱动程序");
  7.         try {
  8.                 Thread.sleep(5000);
  9.         } catch (InterruptedException e) {
  10.                 e.printStackTrace();
  11.         }
  12.         System.exit(-1);
  13. }
复制代码
为什么taInfo.setText("无法加载jdbc驱动程序");这条语句执行没有效果呢?我想让窗口显示异常信息并延时退出,但是为什么只延时退出不在窗口显示出错信息呢?理想结果如下:

完整代码如下:
  1. import java.awt.BorderLayout;
  2. import java.awt.Container;
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5. import java.sql.Connection;
  6. import java.sql.DriverManager;
  7. import java.sql.PreparedStatement;
  8. import java.sql.ResultSet;
  9. import java.sql.SQLException;
  10. import javax.swing.JButton;
  11. import javax.swing.JFrame;
  12. import javax.swing.JLabel;
  13. import javax.swing.JPanel;
  14. import javax.swing.JScrollPane;
  15. import javax.swing.JTextArea;
  16. import javax.swing.JTextField;
  17. /*
  18. * 使用预编译的SQL语句查询access数据库
  19. */
  20. public class PrepareQuery extends JFrame implements ActionListener {
  21.         private static final long serialVersionUID = 1L;
  22.         
  23.         JLabel jlName = new JLabel("姓名");
  24.         JTextField tfName = new JTextField();
  25.         JButton jbQuery = new JButton("查询");
  26.         JTextArea taInfo = new JTextArea();
  27.         JScrollPane pane = new JScrollPane();
  28.         JPanel panel = new JPanel();
  29.         public PrepareQuery() {
  30.                 super("执行预编译语句");
  31.                 setSize(350, 260);
  32.                 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  33.                 panel.setLayout(new BorderLayout());
  34.                 panel.add(jlName, BorderLayout.WEST);
  35.                 panel.add(tfName, BorderLayout.CENTER);
  36.                 panel.add(jbQuery, BorderLayout.EAST);
  37.                 jbQuery.addActionListener(this);
  38.                 pane.getViewport().add(taInfo);
  39.                 Container container = this.getContentPane();
  40.                 container.setLayout(new BorderLayout());
  41.                 container.add(panel, BorderLayout.NORTH);
  42.                 container.add(pane, BorderLayout.CENTER);
  43.         }
  44.         //使用预编译SQL语句查询数据库
  45.         public void getRecord() {
  46.                 try {
  47.                         //加载驱动程序
  48.                         Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
  49.                 } catch (ClassNotFoundException e1) {
  50.                         taInfo.setText("无法加载jdbc驱动程序");
  51.                         try {
  52.                                 Thread.sleep(5000);
  53.                         } catch (InterruptedException e) {
  54.                                 e.printStackTrace();
  55.                         }
  56.                         System.exit(-1);
  57.                 }
  58.                 Connection con = null;
  59.                 try {
  60.                         String url = "jdbc:odbc:Students";
  61.                         con = DriverManager.getConnection(url);
  62.                         String sql = "select * from student where s_name = ?";
  63.                         
  64.                         PreparedStatement preSt = con.prepareStatement(sql);
  65.                         String name = tfName.getText().trim();
  66.                         preSt.setString(1, name);
  67.                         ResultSet rs = preSt.executeQuery();
  68.                         //判断结果集是否有结果,有的话显示结果集
  69.                         if (rs.next() == false) {
  70.                                 taInfo.setText("没有找到符合要求的记录");
  71.                         } else {
  72.                                 do {
  73.                                         taInfo.append(rs.getInt(1) + "\t");
  74.                                         taInfo.append(rs.getString(2) + "\t");
  75.                                         taInfo.append(rs.getString(3) + "\t");
  76.                                         taInfo.append(rs.getString(4) + "\t");
  77.                                         taInfo.append(rs.getInt(5) + "\n");
  78.                                 } while (rs.next());
  79.                         }
  80.                         rs.close();
  81.                         preSt.close();
  82.                 } catch (SQLException e) {
  83.                         taInfo.setText(e.getMessage());
  84.                 } finally {
  85.                         try {
  86.                                 con.close();
  87.                         } catch (SQLException e) {
  88.                                 taInfo.setText(e.getMessage());
  89.                         }
  90.                 }
  91.         }
  92.         public static void main(String[] args) {
  93.                 PrepareQuery frame = new PrepareQuery();
  94.                 frame.setVisible(true);
  95.         }
  96.         //查询按钮动作
  97.         public void actionPerformed(ActionEvent e) {
  98.                 taInfo.setText("");
  99.                 if (e.getSource() == jbQuery) {
  100.                         this.getRecord();
  101.                 }
  102.         }
  103. }
复制代码
执行结果如图:


TM截图20130501013536.png (4.33 KB, 下载次数: 0)

实际窗口显示结果

实际窗口显示结果

TM截图20130501011324.png (5.43 KB, 下载次数: 0)

理想窗口显示结果

理想窗口显示结果

作者: 孙胜    时间: 2013-5-1 10:24
//加载驱动程序
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
这段代码就没有发生异常,所以catch语句是没有执行的,不光是文本域没有文字输出,jvm也不会退出.

作者: xiewen    时间: 2013-5-1 13:53

加载驱动程序Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");没有出错, 这句代码  if (rs.next() == false) 这样写更好 if (rs.next()) 就是把“==false”去掉。可能是你输入的名字在数据库没有记录
作者: 赵熠东(赵东东)    时间: 2013-5-2 09:40
孙胜 发表于 2013-5-1 10:24
//加载驱动程序
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
这段代码就没有发生异常,所以cat ...

我是要Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");故意出错,测试catch语句的执行,可以把它改成一个不存在的字符串如果"sun.jdbc.odbc.JdbcOdbcDriverError",然后这条语句taInfo.setText("无法加载jdbc驱动程序");执行后并没有在窗口上显示"无法加载jdbc驱动程序",这是为什么呢?
作者: 赵熠东(赵东东)    时间: 2013-5-2 09:44
xiewen 发表于 2013-5-1 13:53
加载驱动程序Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");没有出错, 这句代码  if (rs.next() == fa ...

你说的对,这样更便于阅读,不过我的意思是说:
我是要Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");故意出错,测试catch语句的执行,可以把它改成一个不存在的字符串如果"sun.jdbc.odbc.JdbcOdbcDriverError",然后这条语句taInfo.setText("无法加载jdbc驱动程序");执行后并没有在窗口上显示"无法加载jdbc驱动程序",这是为什么呢?
作者: 孙胜    时间: 2013-5-2 10:12
赵熠东(赵东东) 发表于 2013-5-2 09:44
你说的对,这样更便于阅读,不过我的意思是说:
我是要Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); ...

才发现你用上了win8系统了?
你故意写错。e.printStackTrace()这句话执行没有
作者: 赵熠东(赵东东)    时间: 2013-5-2 15:25
本帖最后由 赵熠东(赵东东) 于 2013-5-2 15:31 编辑
孙胜 发表于 2013-5-2 10:12
才发现你用上了win8系统了?
你故意写错。e.printStackTrace()这句话执行没有

挺细心的哈,这都能看得出来,Win8尝试了很长时间才喜欢上的,除了低分辨率显示器下不如Win7漂亮外,其它都挺好的。
Thread.sleep(5000);这条语句正常执行了,所以catch中的e.printStackTrace()没有执行。我怀疑taInfo.setText("无法加载jdbc驱动程序");执行无效果,跟java GUI的工作原理有关系
作者: 孙胜    时间: 2013-5-2 17:32
赵熠东(赵东东) 发表于 2013-5-2 15:25
挺细心的哈,这都能看得出来,Win8尝试了很长时间才喜欢上的,除了低分辨率显示器下不如Win7漂亮外,其它 ...

我没说清楚,你把System.exit(-1)上面的try快去掉,改成e1.printStactTrace()看看。异常有没有发生
作者: 赵熠东(赵东东)    时间: 2013-5-3 19:16
孙胜 发表于 2013-5-2 17:32
我没说清楚,你把System.exit(-1)上面的try快去掉,改成e1.printStactTrace()看看。异常有没有发生 ...

没问题的,异常确实执行到了,全部都可以正常执行到,只是在图形界面上没有显示出来结果。
作者: 曹睿翔    时间: 2013-5-4 06:58
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
作者: 赵熠东(赵东东)    时间: 2013-5-6 21:25
估计是没人回答了,还是等以后学得再深入一些再解决吧。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2