我在主线程中得到异常......即使我处理异常

时间:2010-04-10 20:52:34

标签: java exception

public KalaGame(KeyBoardPlayer player1,KeyBoardPlayer player2)
 {   //super(0);
 int key=0;
 try
 {

     do{
     System.out.println("Enter the number of stones to play with: ");

      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
        key = Integer.parseInt(br.readLine());  


    if(key<0 || key>10)
  throw new InvalidStartingStonesException(key);
  }
 while(key<0 || key>10);
    player1=new KeyBoardPlayer();
   player2 = new KeyBoardPlayer(); 
   this.player1=player1;
   this.player2=player2;
   state=new KalaGameState(key);



 }


    catch(IOException  e)
    {
       System.out.println(e);
      }
     } 

当我输入无效数量的宝石时,我收到此错误

线程“main”中的异常InvalidStartingStonesException:起始宝石的数量必须大于0且小于或等于10(尝试22)

为什么不是由我在

定义的throw处理的异常

KalaGame.<init>(KalaGame.java:27) at PlayKala.main(PlayKala.java:10)

4 个答案:

答案 0 :(得分:5)

您只处理IOException但不处理被抛出的异常,即InvalidStartingStonesException

答案 1 :(得分:1)

您可以捕获多个异常类型并相应地过滤它们:

try
{
 // ...
}
catch(IOException ioe)
{
 // ...
}
catch(Exception ex)
{
 // ...
}

您可以添加此最后一个catch块以匹配任何异常。

答案 2 :(得分:0)

听起来它正在被投掷处理。通过调用throw,您告诉Java“退出程序并打印出InvalidStartingStonesException”。听起来这就是正在发生的事情。如果您有以下内容:

catch(InvalidStartingStonesException{
   // code to handle the exception goes here
}

然后程序将运行您的错误处理代码。如果此异常扩展了IOException,那么您已经有一个catch会打印异常。

答案 3 :(得分:0)

catch(IOException)块没有捕获异常,因为InvalidStartingStonesException不是IOException,也不是它的后代。

您的异常是未经检查的异常,就像IllegalArgumentException一样。编译器并没有强制程序员捕获这样的异常,因为它们通常代表错误而不是可以处理的情况。

由于没有捕获异常,它会在主线程的调用堆栈中一直向下传播,直到程序终止。