当我试图编译我的Java代码时,为什么我会得到“异常;必须被捕获或声明为被抛出”?

当我试图编译我的Java代码时,为什么我会得到“异常;必须被捕获或声明为被抛出”?

考虑:

import java.awt.*;import javax.swing.*;import java.awt.event.*;import javax.crypto.*;import javax.crypto.spec.*;import java.security.*;
import java.io.*;public class EncryptURL extends JApplet implements ActionListener {

    Container content;
    JTextField userName = new JTextField();
    JTextField firstName = new JTextField();
    JTextField lastName = new JTextField();
    JTextField email = new JTextField();
    JTextField phone = new JTextField();
    JTextField heartbeatID = new JTextField();
    JTextField regionCode = new JTextField();
    JTextField retRegionCode = new JTextField();
    JTextField encryptedTextField = new JTextField();

    JPanel finishPanel = new JPanel();


    public void init() {

        //setTitle("Book - E Project");
        setSize(800, 600);
        content = getContentPane();
        content.setBackground(Color.yellow);
        content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));

        JButton submit = new JButton("Submit");

        content.add(new JLabel("User Name"));
        content.add(userName);

        content.add(new JLabel("First Name"));
        content.add(firstName);

        content.add(new JLabel("Last Name"));
        content.add(lastName);

        content.add(new JLabel("Email"));
        content.add(email);

        content.add(new JLabel("Phone"));
        content.add(phone);

        content.add(new JLabel("HeartBeatID"));
        content.add(heartbeatID);

        content.add(new JLabel("Region Code"));
        content.add(regionCode);

        content.add(new JLabel("RetRegionCode"));
        content.add(retRegionCode);

        content.add(submit);

        submit.addActionListener(this);
    }
}

我得到了一个未报告的例外:

java.lang.Exception; must be caught or declared to be thrownbyte[] encrypted = encrypt(concatURL);

以及:

.java:109: missing return statement

如何解决这些问题?


胡说叔叔
浏览 972回答 3
3回答

宝慕林4294392

问题在于这种方法:&nbsp;&nbsp;public&nbsp;static&nbsp;byte[]&nbsp;encrypt(String&nbsp;toEncrypt)&nbsp;throws&nbsp;Exception{这是方法签名上面写着:方法名称是:加密它接收什么参数:一个名为图恩密特其访问修饰符:公共静电如果可能的话抛出调用时的异常。在这种情况下,方法签名表明,当调用该方法时,“可能会”抛出类型为“Exception”的异常。&nbsp;&nbsp;&nbsp;&nbsp;.... &nbsp;&nbsp;&nbsp;&nbsp;concatURL&nbsp;=&nbsp;padString(concatURL,&nbsp;'&nbsp;',&nbsp;16); &nbsp;&nbsp;&nbsp;&nbsp;byte[]&nbsp;encrypted&nbsp;=&nbsp;encrypt(concatURL);&nbsp;<--&nbsp;HERE!!!!! &nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;encryptedString&nbsp;=&nbsp;bytesToHex(encrypted); &nbsp;&nbsp;&nbsp;&nbsp;content.removeAll(); &nbsp;&nbsp;&nbsp;&nbsp;......所以编译器是这样说的:要么用try/catch构造包围它,要么声明方法(在其中使用)抛出“Exception”它Self。真正的问题是“加密”方法定义。任何方法都不应该返回“异常”,因为它太泛化了,并且可能隐藏其他一些。例外类型最好是有一个具体的例外。试试这个:public&nbsp;static&nbsp;byte[]&nbsp;encrypt(String&nbsp;toEncrypt)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;try{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;plaintext&nbsp;=&nbsp;toEncrypt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;key&nbsp;=&nbsp;"01234567890abcde"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;iv&nbsp;=&nbsp;"fedcba9876543210"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SecretKeySpec&nbsp;keyspec&nbsp;=&nbsp;new&nbsp;SecretKeySpec(key.getBytes(),&nbsp;"AES"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IvParameterSpec&nbsp;ivspec&nbsp;=&nbsp;new&nbsp;IvParameterSpec(iv.getBytes()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cipher&nbsp;cipher&nbsp;=&nbsp;Cipher.getInstance("AES/CBC/NoPadding"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cipher.init(Cipher.ENCRYPT_MODE,keyspec,ivspec); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[]&nbsp;encrypted&nbsp;=&nbsp;cipher.doFinal(toEncrypt.getBytes()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;encrypted; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(&nbsp;NoSuchAlgorithmException&nbsp;nsae&nbsp;)&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;What&nbsp;can&nbsp;you&nbsp;do&nbsp;if&nbsp;the&nbsp;algorithm&nbsp;doesn't&nbsp;exists?? &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;this&nbsp;usually&nbsp;won't&nbsp;happen&nbsp;because&nbsp;you&nbsp;would&nbsp;test&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;your&nbsp;code&nbsp;before&nbsp;shipping.&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;So&nbsp;in&nbsp;this&nbsp;case&nbsp;is&nbsp;ok&nbsp;to&nbsp;transform&nbsp;to&nbsp;another&nbsp;kind&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;IllegalStateException(&nbsp;nsae&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(&nbsp;NoSuchPaddingException&nbsp;nspe&nbsp;)&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;What&nbsp;can&nbsp;you&nbsp;do&nbsp;when&nbsp;there&nbsp;is&nbsp;no&nbsp;such&nbsp;padding&nbsp;(&nbsp;whatever&nbsp;that&nbsp;means&nbsp;)&nbsp;?? &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;I&nbsp;guess&nbsp;not&nbsp;much,&nbsp;in&nbsp;either&nbsp;case&nbsp;you&nbsp;won't&nbsp;be&nbsp;able&nbsp;to&nbsp;encrypt&nbsp;the&nbsp;given&nbsp;string &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;IllegalStateException(&nbsp;nsae&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;line&nbsp;109&nbsp;won't&nbsp;say&nbsp;it&nbsp;needs&nbsp;a&nbsp;return&nbsp;anymore. &nbsp;&nbsp;}基本上,在这种特殊情况下,您应该确保密码包在系统中可用。Java需要对加密包进行扩展,因此,异常被声明为“检查”异常。让你在他们不在场的时候处理。在这个小程序中,如果密码包不可用,您就不能做任何事情,所以您可以在“开发”时检查它。如果程序运行时抛出这些异常是因为您在“开发”中做错了什么,那么RuntimeException子类更合适。最后一行不再需要返回语句了,在第一个版本中,您捕获了异常而对其不做任何操作,这是错误的。try&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;risky&nbsp;code&nbsp;...&nbsp;}&nbsp;catch(&nbsp;Exception&nbsp;e&nbsp;)&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;a&nbsp;bomb&nbsp;has&nbsp;just&nbsp;exploited &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;you&nbsp;should&nbsp;NOT&nbsp;ignore&nbsp;it&nbsp;}&nbsp;//&nbsp;The&nbsp;code&nbsp;continues&nbsp;here,&nbsp;but&nbsp;what&nbsp;should&nbsp;it&nbsp;do???如果代码要失败,最好是快速失败以下是一些相关的答案:在Java中捕获异常何时选择“检查”和“未检查”异常为什么不用显式声明您可以抛出Java中内置的一些异常呢?除RuntimeException之外的异常

慕斯王

第一个错误异常;必须捕获或声明为抛出字节[]加密=加密(串联URL);意味着你的encrypt方法引发未由actionPerformed方法调用它。在Java异常教程.您可以从中选择几个选项来编译代码。你可以移除throws Exception从你的encrypt方法和实际手柄内部异常encrypt.可以从encrypt加上throws Exception的异常处理块actionPerformed方法。通常最好在最低级别处理异常,而不是将其传递到更高的级别。第二个错误只意味着您需要向包含第109行的任何方法中添加一个返回语句(也是encrypt,在这种情况下)。方法中有返回语句,但如果抛出异常,则可能无法到达异常,因此需要在CATCH块中返回,或者从encrypt就像我之前提到的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java