Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中创建自定义异常类型?_Java_Exception - Fatal编程技术网

如何在Java中创建自定义异常类型?

如何在Java中创建自定义异常类型?,java,exception,Java,Exception,我想用Java创建一个自定义异常,我该怎么做 ... try{ ... String word=reader.readLine(); if(word.contains(" ")) /*create custom exception*/ } catch(){ 当我使用throw new…创建自定义异常时,我获得了一个错误未报告的异常…必须被捕获或声明为抛出您应该能够创建一个扩展该类的自定义异常类,例如: class WordContainsException extends Exc

我想用Java创建一个自定义异常,我该怎么做

...

try{

...

String word=reader.readLine();

if(word.contains(" "))
  /*create custom exception*/

}
catch(){

当我使用
throw new…
创建自定义异常时,我获得了一个错误
未报告的异常…必须被捕获或声明为抛出

您应该能够创建一个扩展该类的自定义异常类,例如:

class WordContainsException extends Exception
{
      // Parameterless Constructor
      public WordContainsException() {}

      // Constructor that accepts a message
      public WordContainsException(String message)
      {
         super(message);
      }
 }
用法:

try
{
     if(word.contains(" "))
     {
          throw new WordContainsException();
     }
}
catch(WordContainsException ex)
{
      // Process message however you would like
}

异常是一个类似于任何其他类的类,只是它从扩展而来。因此,如果您创建自己的类

public class MyCustomException extends Exception
你可以将这样一个实例与

   throw new MyCustomException( ... );
   //using whatever constructor params you decide to use

这可能是一个有趣的阅读

您必须将您的异常定义为一个新类

public class YourCustomException extends Exception{

//Required inherited methods here
}

然后您可以随意抛出和捕获CustomException。

因为您可以创建和抛出异常

if ( word.contains(" ") )
{
     throw new RuntimeException ( "Word contains one or more spaces" ) ;
}
如果您想更正式一些,可以创建一个异常类

class SpaceyWordException extends RuntimeException
{

}

无论哪种方式,如果您使用
RuntimeException
,您的新
异常将被取消选中。

您只需要创建一个类来扩展Exception(对于选中的异常)或Exception的任何子类,或RuntimeException(对于运行时异常)或RuntimeException的任何子类

然后,在代码中,只需使用

if (word.contains(" "))
    throw new MyException("some message");
}

阅读Java教程。这是每个Java开发人员都应该知道的基本知识:

您需要创建一个从
Exception
扩展的类。应该是这样的:

public class MyOwnException extends Exception {
    public MyOwnException () {

    }

    public MyOwnException (String message) {
        super (message);
    }

    public MyOwnException (Throwable cause) {
        super (cause);
    }

    public MyOwnException (String message, Throwable cause) {
        super (message, cause);
    }
}
您的问题没有指定是否应选中或取消选中此新异常

如您所见,这两种类型是不同的:

  • 选中的异常用于标记有问题的情况,该情况应由调用您的方法的开发人员处理。应该可以从这种异常中恢复。这方面的一个很好的例子是。这些例外情况是的子类

  • 未经检查的异常表示代码中的错误,这是一种您可能无法恢复的意外情况。A是一个经典的例子。这些例外是


选中的异常必须由调用方法处理,可以捕获异常并相应地执行操作,也可以将异常抛出到调用方法。未经检查的异常并不意味着要被捕获,即使可以这样做。

您可以通过继承
java.lang.exception

是一个可以帮助您做到这一点的示例。

关于创建自定义异常类的极好答案。如果您打算重用有问题的异常,那么我将遵循他们的答案/建议。但是,如果您只需要抛出一个带有消息的快速异常,那么您可以当场使用基本异常类

String word=reader.readLine();

if(word.contains(" "))
  /*create custom exeception*/
  throw new Exception("My one time exception with some message!");
}

由于细心的程序员经常会为特殊事件抛出异常,因此值得一提的是一些通用异常,如
IllegalArgumentException
UnsupportedOperationException
IllegalArgumentException
是我的最爱:

throw new IllegalArgumentException("Word contains blank: " + word);

一些答案可以讨论检查与未检查的例外情况吗?扩展异常意味着什么?运行时异常?可以扔掉吗,有1)创建自定义异常类型/类(如多次所示)和2)引发异常。要引发异常,只需将适当的实例传递给
throw
,通常为:
throw new myformatexpection(“不允许使用空格”)--您甚至可以使用标准,而无需“创建”自定义异常类型。@pst很好。我在回答中添加了一些关于检查异常和未检查异常的信息。请参阅有关Java中异常类创建和处理的视频教程。这只是异常的声明,可以通过简单的throw new WordContainsException()抛出它;更新并添加了用法。应该包含什么
catch()
?您的代码中似乎已经有了catch,我不确定您希望将异常抛出的确切位置。你可以把它放在接球区的前面,或者里面。我对它进行了编辑,假设您可能希望如何使用该异常您应该再添加两个构造函数(
WordContainsException(Throwable)
WordContainsException(String,Throwable)
)要正确地支持@Danilopiazzalanga,除非您使用异常链接,否则不需要支持异常链接。为什么必须这样?(1) 如果我正在创建自己的专有异常,我会将其设置为包私有(如果不是顶级的,则设置为私有)。(2) 同样的事情也发生在构造器上。(3) 除非我需要,否则我不会定义4个构造函数。(1)您应该将新异常设置为公共异常,以便调用您的方法的方法可以捕获此新异常并对其进行处理(如果您想将此新异常设置为选中异常,请参阅我的编辑。(2)将构造函数设置为公共异常,无需隐藏它们。(3)你可以去掉你不需要的构造函数,所有4个都不是强制性的。这是非常糟糕的做法,因为调用代码无法区分“我想捕获每种异常并做一些一般性的事情”和“我想捕获所谓的一次性异常并做一些特别的事情”前一种捕获物只能在非常有限的条件下使用——比如在顶级环路中——这会使情况更加恶化。这样做会更好(但仍有争议)有一个名为
OneTimeException
的实用程序异常类。这样,调用方就有机会在某种程度上区分它们,而不是在所有情况下捕获每个异常。这些都是运行时异常,对吗?也许细心的程序员会避免过度使用它们。@jpaugh谢谢你让我吞下我的own字;)。谢谢你,对不起!我不是故意粗鲁的。运行时异常确实占有一席之地,特别是对于您推荐的内容。然而,当我浏览文档并看到RuntimeExcep时,我感到惊讶