3

我是Java初学者,请多多包涵

static int load = 100;
static int greet;

public void loadDeduct(int cLoad, int c){
    int balance;
    balance = cLoad - 7;
    System.out.println("Your balance: " + balance);
}

public void loadDeduct(int tLoad){
    int balance;
    balance = tLoad - 1;
    System.out.println("Your balance is: " + balance);
}

public static void main (String [] args){
    int choice;
    Scanner scan = new Scanner(System.in);

    System.out.println("I'm a cellphone, what do you want to do?");
    System.out.println("Press 1 to send SMS / Press 2 to Call");

    choice = scan.nextInt();

    CellphoneLoad N95 = new CellphoneLoad();

    if (choice == 1){
        N95.loadDeduct(load);
    }else if (choice == 2){
        N95.loadDeduct(load, greet);
    }else{
        System.out.println("Invalid Option!!!");
    }

如何用这个程序实现异常处理?我不太确定如何使用 catch 块,因为我们还没有被告知整个异常的事情。这只是我们被要求做的一个练习。我想用 try-catch 块替换 if else 语句......这可能吗?

4

7 回答 7

2

Java 中要考虑的一个重要原则是异常有两种类型: 1. 运行时 2. 类型化/显式(因为没有更好的词)

当出现编程错误时应该抛出运行时异常,并且通常不应捕获它们,除非您在顶层捕获以报告错误。

类型化/显式异常在方法调用上被修饰并且应该存在以便调用者可以对它们采取一些行动。

在上面的代码的情况下,没有一个地方感觉应该使用异常处理。

正如帕特里克指出的那样,您通常不希望使用异常来进行流控制。

于 2009-05-08T04:17:37.127 回答
1

Scanner.nextInt()方法可以抛出一些异常。API Specifications 的链接页面列出了可以抛出的三个异常。

例如,如果输入了一个非整数值,例如"one"代替1InputMismatchException则可以抛出 an。

通常,atry-catch用于捕获异常,如下面的代码所示:

try
{
    Integer.parseInt("one");      // Statement that can cause an exception.
}
catch (NumberFormatException e)   // Specify which exception to catch.
{
    // Code to handle the NumberFormatException.
}

有关异常的更多信息,请参见课程:Java 教程的异常。特别是,捕获和处理异常部分可能很有用。

于 2009-05-08T04:16:58.703 回答
1

在这段代码中添加异常不会增加太多价值。我能想到的是这样的:

public static void main (String [] args){

.....

try{
 handleUserChoice(choice);//new method
}
catch(InvalidChoiceException e){
 System.out.println("Invalid Option!!!");
}
}
于 2009-05-08T04:18:14.677 回答
1

使用异常进行流控制并不理想。从您的代码中不清楚可能会引发哪些异常。也许你可以详细说明一下。

于 2009-05-08T04:02:56.490 回答
1

您的代码中唯一可能引发异常的部分是调用:

scan.nextInt();

根据 JavaDocs,这可能会引发以下可能的异常:

  • InputMismatchException(如果下一个标记与 Integer 正则表达式不匹配,或者超出范围)
  • NoSuchElementException(如果输入已用尽)
  • IllegalStateException(如果此扫描仪已关闭)

所以如果你想让你的代码考虑到这些异常被抛出的可能性,你应该像这样重写它:

try {
    choice = scan.nextInt();
} 
catch (InputMismatchException e) {
  System.out.println(e.getMessage());
}
catch (NoSuchElementException e) {
  System.out.println(e.getMessage());
}
catch (IllegalStateException e) {
  System.out.println(e.getMessage());
}

通常,您希望您的“捕获”块从特定的或很可能发生在性质上不太可能/更一般的开始。

您还可以“抛出”异常,以便发生异常的任何方法都不会处理它 - 调用该异常导致方法的方法必须处理它(或再次抛出它等,直到它到达Java 运行时)。

如果您要替换的是“if”语句,我建议使用“switch”语句:

switch (choice) {
    case 1:  N95.loadDeduct(load);
             break;
    case 2:  N95.loadDeduct(load, greet);
             break;
    default: System.out.println("Invalid Option!!!");
}
于 2009-05-08T04:04:48.670 回答
0

我看不出有任何理由使用异常而不是 if-else 块。您可以尝试使用 switch 语句,它看起来会更好。

您应该使用异常来处理方法 loadDeduct 中可能发生的错误。然后你会用 try-catch 块包围调用 N95.loadDeduct 的行,以写出如果 loadDeduct 出错会发生什么。

于 2009-05-08T04:08:40.767 回答
0

这真的很简单。首先确定您想要异常的位置。库代码可能会抛出异常,也可以抛出自己的异常。然后使用 try .. catch 来处理它。这是一个简单的“你好,世界”的例子:

public class TryTry {

    public void doIt() throws Exception {
       System.err.println("In the doIt method.");
       throw new Exception("Hello there!");
    }

    public static void main(String[] argv){
       TryTry t = new TryTry();
       // here we'll catch it.
       try {
           System.err.println("About to call doIt().");
          t.doIt();
       } catch (Exception e) {  // e now has your exception object
          System.err.println("In the exception handler.");
          System.err.println("Exception says: "+ e);
       }
    }
}

throw 的作用是构造该异常对象并将其向上发送到堆栈,直到它被捕获。为了捕捉它,你用 包围可能抛出它的代码tr { ... },并用 处理异常catch

结果如下:

javac TryTry.java && java TryTry
即将调用 doIt()。
在 doIt 方法中。
在异常处理程序中。
异常说:java.lang.Exception:你好!
于 2009-05-08T04:02:20.783 回答