Java 写入运行时异常

Java 写入运行时异常,java,exception-handling,Java,Exception Handling,假设我希望代码中的特定“案例”有一个未经检查的异常-- 假设队列已满75%。我所需要的只是一个例外,上面写着“队列已达到75%的阈值” 一,最明显的方法是 public class QueueT extends RuntimeException { QueueT () { super("queue has reached the 75% threshold"); } } 我对该异常的唯一用途是 try { // some stuff here thr

假设我希望代码中的特定“案例”有一个未经检查的异常-- 假设队列已满75%。我所需要的只是一个例外,上面写着“队列已达到75%的阈值”

一,最明显的方法是

public class QueueT extends RuntimeException {
  QueueT () {
      super("queue has reached the 75% threshold");
  }
}
我对该异常的唯一用途是

  try {
     // some stuff here
     throw new QueueT();
     } catch (QueueT e) {
        System.out.print("<<"+e+">>");
       }

提前谢谢

您得到的是,在您的第一个示例中

try {
   // some stuff here
   throw new QueueT();
} catch (RuntimeException e) {
   System.out.print("<<"+e+">>");
}

在这里,您可以非常准确地说出要捕获的错误类型。否则,您可能会让代码的另一部分抛出运行时异常,并且处理几乎满的队列的代码可能会尝试应用于与队列完全无关的异常。如果只捕获
队列
异常,则可以更好、更准确地应用代码。

如果稍微更改catch子句,则第一次调用的兴趣很容易理解:

 try {
// some stuff here
throw new QueueT();
} catch (QueueT e) {
   System.out.print("<<"+e+">>");
}
试试看{
//这里有些东西
抛出新队列();
}捕获(队列e){
系统输出打印(“”);
}
因此,您将只捕获队列实例,而不是可能的其他运行时,如null指针,这种异常最好传播到入口点,以便检测一些编码或设计问题。 事实上,在您首先编写的代码中,您将无法区分预期的完全队列情况和实际的运行时错误。您将丢失错误信息,程序将表现为队列已满而队列未满

一个好的实践是永远不要捕获异常超类型,无论是运行时还是可丢弃(最糟糕的一种)

另一种方法是使用异常后缀命名异常:例如QueueAboutFullException

另一种方法是,如果捕获异常的位置与抛出异常的位置大致相同,则不要使用异常编程。更喜欢简单的if,因为它比中断要便宜得多

假设我想在代码中为特定的“case”设置一个未经检查的异常——比如当队列已满75%时。我所需要的只是一个例外,上面写着“队列已达到75%的阈值”

这是一个很糟糕的例外情况。异常不用于业务逻辑;它们用于特殊情况。这似乎是一个预期的场景,更像是一个通知而不是一个异常。您希望捕捉到此异常的人如何反应?别理它?如果是,例外的目的是什么?此外,以这种方式使用异常根本没有性能,因为它必须填充堆栈跟踪,重复这样做会使性能非常差


至于你的另一个问题,使用你自己的运行时异常与
RuntimeException
相比的好处是,你现在有了你自己的异常,它(希望)在语义上是合适的,你可以适当地抛出或处理它。仅仅使用
RuntimeException
本身并不能提供太多的信息。

复制粘贴错误——纠正它。这应该是一个队列异常。哦,好的。好吧,我的回答的后半部分仍然适用。我想知道“幕后”是否还有其他东西,但我想这就是了。我还没仔细研究过原因。当然,对被禁止的例外情况也有区别。thx用于输入。创建您自己的异常类型,您可以为您的异常和其他RuntimeException使用不同的try-catch块,如果需要,您可以添加更多功能性。对于第二部分,只需在声明异常类时添加percentage属性,并添加将处理此参数的构造函数(如
super(“队列已达到”+百分比+%阈值”)
我完全同意第一部分
try {
   // some stuff here
   throw new QueueT();
} catch (RuntimeException e) {
   System.out.print("<<"+e+">>");
}
try {
   // some stuff here
   throw new QueueT();
} catch (QueueTe e) {
   System.out.print("<<"+e+">>");
}
 try {
// some stuff here
throw new QueueT();
} catch (QueueT e) {
   System.out.print("<<"+e+">>");
}