Pourquoi suis-je “Exception, doivent être pris ou d'déclaré être " jeté” lorsque j'essaie de compiler mon code Java?
Considérer:
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);
}
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand() == "Submit"){
String subUserName = userName.getText();
String subFName = firstName.getText();
String subLName = lastName.getText();
String subEmail = email.getText();
String subPhone = phone.getText();
String subHeartbeatID = heartbeatID.getText();
String subRegionCode = regionCode.getText();
String subRetRegionCode = retRegionCode.getText();
String concatURL =
"user=" + subUserName + "&f=" + subFName +
"&l=" + subLName + "&em=" + subEmail +
"&p=" + subPhone + "&h=" + subHeartbeatID +
"&re=" + subRegionCode + "&ret=" + subRetRegionCode;
concatURL = padString(concatURL, ' ', 16);
byte[] encrypted = encrypt(concatURL);
String encryptedString = bytesToHex(encrypted);
content.removeAll();
content.add(new JLabel("Concatenated User Input -->" + concatURL));
content.add(encryptedTextField);
setContentPane(content);
}
}
public static byte[] encrypt(String toEncrypt) throws Exception{
try{
String plaintext = toEncrypt;
String key = "01234567890abcde";
String iv = "fedcba9876543210";
SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
byte[] encrypted = cipher.doFinal(toEncrypt.getBytes());
return encrypted;
}
catch(Exception e){
}
}
public static byte[] decrypt(byte[] toDecrypt) throws Exception{
String key = "01234567890abcde";
String iv = "fedcba9876543210";
SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);
byte[] decrypted = cipher.doFinal(toDecrypt);
return decrypted;
}
public static String bytesToHex(byte[] data) {
if (data == null)
{
return null;
}
else
{
int len = data.length;
String str = "";
for (int i=0; i<len; i++)
{
if ((data[i]&0xFF) < 16)
str = str + "0" + java.lang.Integer.toHexString(data[i]&0xFF);
else
str = str + java.lang.Integer.toHexString(data[i]&0xFF);
}
return str;
}
}
public static String padString(String source, char paddingChar, int size)
{
int padLength = size-source.length() % size;
for (int i = 0; i < padLength; i++) {
source += paddingChar;
}
return source;
}
}
Je suis un non déclarée exception:
java.lang.Exception; must be caught or declared to be thrown
byte[] encrypted = encrypt(concatURL);
Ainsi que:
.java:109: missing return statement
Comment puis-je résoudre ces problèmes?
- S'il vous plaît! pouvez-vous format votre code?
- Pourriez-vous modifier la question, de sorte que la source s'affiche correctement? Chaque ligne doit être en retrait d'un minimum de 4 espaces.
- Vous devez générer un autre IV chaque fois que vous chiffrer. La IV n'a pas besoin d'être gardé secret; il suffit de les passer avec le contenu chiffré.
Vous devez vous connecter pour publier un commentaire.
Tous vos problèmes découlent de cette
Qui sont incluses dans un bloc catch, le problème est que dans le cas où le programme trouve une exception vous de ne pas retourner quoi que ce soit. Le mettre comme ceci (à modifier selon votre logique du programme des stands):
Pour le second, vous devez attraper l'Exception de la chiffrer appel de méthode, comme ceci (également le modifier, comme la logique du programme des stands):
Les leçons que vous devez apprendre à partir de ce:
Le problème, c'est cette méthode:
C'est le signature de la méthode qui dit à peu près:
Dans ce cas, la signature de la méthode dit que lors de l'invocation de cette méthode "pourrait" potentiellement lever une exception de type "Exception".
De sorte que les compilateurs dit: Soit vous entourent avec un try/catch ou vous déclarer la méthode ( où utilisé ) pour lancer "Exception" de soi.
Le vrai problème est la "crypter" définition de la méthode. Aucune méthode ne devrait jamais revenir "Exception", parce que c'est trop générique et peut masquer certains autres types d'exception mieux est d'avoir une exception spécifique.
Essayez ceci:
Fondamentalement, dans ce cas particulier, vous devriez assurez-vous que le programme de cryptographie est disponible dans le système.
Java a besoin d'une extension pour le programme de cryptographie, de la sorte, les exceptions sont déclarés comme "vérifié" des exceptions. Pour vous à gérer quand ils ne sont pas présents.
Dans ce petit programme, vous ne pouvez rien faire si le programme de cryptographie n'est pas disponible, de sorte que vous vérifiez qu'au "développement" du temps. Si ces exceptions sont levées lorsque votre programme est en cours d'exécution est parce que vous avez fait quelque chose de mal dans le "développement", et donc une sous-classe RuntimeException est plus approprié.
La dernière ligne n'a pas besoin d'une instruction de retour plus, dans la première version que vous avez été la capture de l'exception et ne rien faire avec elle, c'est faux.
Si le code est à l'échec, il est préférable de Échouer rapidement
Voici quelques réponses:
D'intercepter les Exceptions en Java
Quand choisir activée et désactivée exceptions
Pourquoi vous n'avez pas à déclarer explicitement de ce que vous pourriez jeter un peu de construit dans les exceptions en Java?
Exception autre que RuntimeException
La première erreur
signifie que votre
encrypt
méthode lève une exception qui n'est pas géré ou déclaré par leactionPerformed
méthode où vous êtes en l'appelant. Lisez à ce sujet à la Java Exceptions Tutoriel.Vous avez un couple de choix que vous pouvez choisir pour obtenir le code à compiler.
throws Exception
de votreencrypt
méthode et réellement manipuler l'exception à l'intérieur deencrypt
.encrypt
et ajouterthrows Exception
et le bloc de gestion des exceptions pour votreactionPerformed
méthode.Il est généralement préférable de traiter une exception au niveau le plus bas que vous pouvez, au lieu de passer à un niveau supérieur.
La deuxième erreur signifie simplement que vous avez besoin d'ajouter une instruction de retour de la méthode qui contient la ligne 109 (également
encrypt
, dans ce cas). Il y a une instruction de retour de la méthode, mais si une exception est lancée, il pourrait ne pas être atteint, alors vous avez besoin soit de retour dans le bloc catch, ou supprimer le try/catch deencrypt
, comme je l'ai mentionné avant.Vous aurez besoin de décider comment vous souhaitez gérer les exceptions levées par le
encrypt
méthode.Actuellement,
encrypt
est déclarée avecthrows Exception
- toutefois, dans le corps de la méthode, des exceptions sont pris dans un bloc try/catch. Je vous recommande soit:throws Exception
clause deencrypt
et de gérer les exceptions à l'interne (envisager la rédaction d'un journal de message à tout le moins); ou,encrypt
, et entourent le appel àencrypt
avec un try/catch à la place (c'est à dire dansactionPerformed
).Concernant l'erreur de compilation de vous référer à: si une exception a été levée dans la
try
bloc deencrypt
, rien n'est retourné après lacatch
bloc de finitions. Vous pouvez résoudre ce par abord déclarer la valeur de retour commenull
:Toutefois, si vous pouvez corriger le plus gros problème (à l'exception de manutention de stratégie), ce problème sera de prendre soin de lui-même - en particulier si vous choisissez la deuxième option que j'ai suggéré.
Dans votre "chiffrer" la méthode, vous devez soit obtenir débarrasser de la try/catch et au lieu d'ajouter un try/catch autour de l'endroit où vous appelez chiffrer (à l'intérieur "actionPerformed") ou de retourner la valeur null à l'intérieur de l'attraper à l'intérieur de chiffrer (c'est le deuxième erreur.
Dans
actionPerformed(ActionEvent e)
vous appelezencrypt()
, qui est déclarée à jeterException
. Cependant,actionPerformed
ni les captures de cette Exception (avec try/catch autour de l'appel àencrypt()
), ni déclare qu'il jetteException
lui-même.Votre
encrypt
méthode, cependant, n'a pas vraiment jeterException
. Il avale toutes les Exceptions sans même autant que l'enregistrement d'une plainte. (Les mauvaises pratiques et les mauvais style!)Aussi, votre
encrypt
méthode est le suivant:Qui est, si vous ne capture aucune Exception, de les jeter en silence, puis tomber en bas de votre
encrypt
méthode sans retour rien. Ce ne compile pas (comme vous le voyez), parce qu'une méthode est déclarée pour retourner une valeur doit retourner une valeur ou lever une Exception de tous les possibles chemin d'accès du code.