【问题标题】:error catching exception while System.out.printSystem.out.print 时捕获异常时出错
【发布时间】:2012-09-19 01:17:37
【问题描述】:

我有 2 个类,一个实现双重查找(int i); 以及我在解决问题时使用该查找(int i)的地方,或者在这种情况下打印查找值。本例适用于数组。

所以我阅读了异常文档或谷歌/教科书并附带以下代码:

public double lookup(int i) throws Exception
{
    if( i > numItems)
        throw new Exception("out of bounds");
    return items[i];        
}

把它交给我的班级并尝试打印我的集合,其中 set 是 我在上面的类中定义的对象类型。

public void print()
{
    for (int i = 0; i < set.size() - 1; i++)
    {
        System.out.print(set.lookup(i) + ",");

    }
    System.out.print(set.lookup(set.size()));
}

我使用两个 print() 来避免打印中的最后一个“,”,但我得到了一个

未处理的异常Exception(我的异常名称是Exception)

我认为我必须在我的 print() 中捕获我的异常,但无法在线找到正确的格式。一定要写吗

捕获异常异常?因为这给了我一个语法错误,说 catch 上的类型无效。

来源如 http://docs.oracle.com/javase/tutorial/essential/exceptions/ 对我帮助不大,我似乎无法理解文字告诉我的内容。我也很难找到包含多个示例的来源,而我实际上可以理解示例中的编码。

那么任何人都可以给我一个上述流行语的来源/示例,也许是新Java程序员的一个不错的示例来源?我的书太可怕了,我似乎无法在网上找到上述流行语的可理解示例。

【问题讨论】:

  • 你抛出了一个异常,但从不使用你的 print 方法中的 catch 来处理它。

标签: java exception try-catch throw throws


【解决方案1】:

什么是异常?

例外是针对特殊情况。通常不会发生的情况。举个例子,你去取钱,你的账户有 100 余额,你要求 200,然后 ATM 应该告诉你余额不足。

例外类型

  • 检查异常

    这些是应用程序想要从中恢复的条件。就像上面给出的例子一样,应用程序会给你错误并继续工作。

  • 错误

    这是应用程序外部的异常情况。当没有足够的可用内存并且应用程序无法从中恢复时,我们会说OutOfMemoryError

  • 运行时异常/未经检查的异常

    这些异常是应用程序异常,但在这种情况下应用程序无法从中恢复。例如 NullpointerException 如果 value 为 null 并且你尝试用它做一些讨厌的事情。

以上三个只检查异常需要缓存。

如何抛出和捕获检查异常

ExceptionException 的任何子类是检查异常。可以使用throw 子句抛出已检查的异常。一旦你抛出一个异常,你就必须使用throws 子句将其包含在方法声明中。

因此,任何想要使用此方法的人现在都必须处理该异常。处理异常意味着调用替代流程。就像我们的例子一样,我们向用户"Error Invalid account number."显示文本

调用函数也可以选择传播异常,方法是为其调用的方法抛出的异常添加throws子句。

Generate:
public static double withdraw(int i) throws Exception {
    if (i <= 0)// Out of bounds
        throw new Exception("Invalid Account Number");
    return 0.0;// something;
}

Handle:

try {
        withdraw(0);
    } catch (Exception e) {
        // do something with exception here.
        // Log the exception
        System.out.println("Error Invalid account number.");
    }

Propagate:
      public static double callWithdraw(int i) throws Exception {//Propagate exceptions
        return withdraw(i);
      }

【讨论】:

  • 但这是我不明白的——如果我已经知道 i
  • @user1702633 添加了更多信息。希望它能消除疑虑。任何想要使用该异常的类都可以使用它。您还可以传播异常含义,而不是仅将其包含在 throws 子句中。
【解决方案2】:

通常要表示传入方法的参数不正确,请使用IllegalArgumentException,它是RuntimeException,不应被捕获。

在这种特定情况下,您不必编写任何额外的代码,ArrayIndexOutOfBoundsException 应该负责不正确的数组访问。

抛出表明一个数组被非法访问 指数。指数为负或大于或等于 数组的大小。

【讨论】:

    【解决方案3】:

    我永远不会抛出异常。

    在您的情况下,IndexOutOfBoundException 或 InvalidArgumentException 将是更好的选择。由于这些不是检查异常,因此您不需要捕获它们。

    public double lookup(int i) {
        if(i >= numItems) // assuming numItems is not items.length
            throw new IndexOutOfBoundException("out of bounds " + i + " >= " + numItems);
        return items[i];        
    }
    

    注意:支票应该是&gt;=

    您的 print() 方法现在将编译不变。

    【讨论】:

    • 他还没有理解 例外:) 我会说它会过量。
    • 哦...是的,这听起来更好。我只是想避免使用 Java 提供的预定义工具,因为我还处于初学者水平,想自己尝试一下。
    • 为什么不从一本初学者的书开始,而不是让自己陷入异常呢?事实上,java 的优势之一是您不必自己做很多事情。
    • @Peter 我们应该为这种特殊情况抛出明确的异常吗?我猜 ArrayIndexOutOfBoundsException 应该足够了。
    • 如果您愿意,可以将其添加到throws 子句中,但在这种情况下它是可选的。我更喜欢这样做以明确可能会抛出异常,但主要是因为我并不总是编写 javadocs。 ;)
    【解决方案4】:

    试试这个

    try
    {
        print(); //print() needs to throw the same exception
    } catch(Exception e)
    {
       //handle exception
       System.err.println(e.getMessage()+"\n\n"+e.printStackTrace());
    }
    //finally {
    // cleanup here if you like
    // }
    

    或者这个

    public void print()
    {
        for (int i = 0; i < set.size() - 1; i++)
        {
            try
            {
                System.out.print(set.lookup(i) + ",");
            } catch(Exception e)
            {
              //handle it here
            }
        }
        System.out.print(set.lookup(set.size()));
    }
    

    请注意,使用“投掷”是一种简单的方法;这是一个廉价的委托,有时可以使编码更容易......如果可以,您应该尝试始终使用 try/catch 而不是 throws。

    请注意,无论何时您最终使用带有“抛出”的东西,您都必须将其放入 try/catch 块中并正确处理。

    【讨论】:

    • 所以我认为我应该停止使用 throws 并且我最好一直使用 try/catch。谢谢。
    • 如果您可以处理引发的异常,那么绝对可以。恕我直言,“try/catch”与“throws”有点像“iteration”与“recursion”。您将学习何时使用每一个:)
    • e.printStackTrace() 的返回类型为 void。
    • @ravi 你说得对,我忘了把 PrintWriter 传给它,然后收集它的日志,返回类型为String
    猜你喜欢
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 2010-10-29
    相关资源
    最近更新 更多