当我的编译器告诉我正在使用不安全或未经检查的操作时,这意味着什么?

2024-02-19

我的程序编译得很好,但我的控制台输出以下内容:

 ----jGRASP exec: javac -g CreditGraphics.java

Note: CreditGraphics.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

 ----jGRASP: operation complete.

首先,是什么导致操作不安全?一个流程如何才能“不受检查”? “使用 -Xlint 重新编译”是什么意思?我正在使用 jGrasp,但我不确定这是一个按钮还是某种命令?我想看看细节。它没有指定什么是不安全或未经检查的,但无论如何这是我的代码:

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import java.util.Scanner;
import java.util.Arrays;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.*;
import java.util.*;
import java.io.*;
import javax.mail.*;
import javax.mail.event.*;
import javax.mail.internet.*;
import javax.activation.*;
import java.util.Properties;
import javax.mail.Header;
import java.util.Enumeration;
import java.util.Properties;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.JApplet;
import javax.mail.Authenticator;
import javax.mail.Folder;
import javax.mail.Header;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.URLName;
import java.beans.*;
import java.util.ArrayList;
import javax.swing.SwingUtilities;
import javax.swing.filechooser.*;
import java.util.Scanner;
import java.awt.image.*;
import java.io.*;
import java.net.URL;
import javax.imageio.*;
import javax.swing.Timer;

public class CreditGraphics {

    //first screen variables
    public String cardNum;
    public JFrame frame;
    public JPanel panel;
    public JLabel label;
    public JTextField text;
    public String cardType = "";
    public String carddigits;
    public boolean cardValid;
    public int length;
    public String[] cardTypes;
    public JComboBox cardTypesDD;
    public static ArrayList<Integer> holdDigits = new ArrayList<Integer>();
    public static ArrayList<String> holdDigitsChar = new ArrayList<String>();
    public static int[] checkDigits;
    public static int checkSum = 0;

    //second screen variables in verifyScreen;
    public JFrame vframe;
    public JPanel vpanel;
    public JLabel titlelabel;
    public GridBagConstraints grid;
    public JLabel namelabel;
    public JTextField namefield;

    public CreditGraphics() {

        frame = new JFrame("MES Banking App");
        panel = new JPanel();
        label = new JLabel();
        cardTypes = new String[4];
        cardTypes[0] = "Visa";
        cardTypes[1] = "American Express";
        cardTypes[2] = "Master Card";
        cardTypes[3] = "";
        cardTypesDD = new JComboBox(cardTypes);
        cardTypesDD.setSelectedIndex(3);

        text = new JTextField(16);

        panel.add(label);
        panel.add(cardTypesDD);
        panel.add(text);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        panel.setPreferredSize(new Dimension(500, 500));
        frame.getContentPane().add(panel);

        frame.pack();
        frame.setVisible(true);

        label.setText("<html>Please enter your credit card <br> 'Master Card' 'Visa' or 'American Express'</html>");

        text.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        //after CC type is entered, prompt user to enter digits
                        carddigits = text.getText();//gets credit card number from jtextfield
                        length = carddigits.length();//sets length of card
                        validateCard(); //uses credit card number and length to determine if it matches up to brand

                        //below returns if card is valid
                        if (cardValid == true) {
                            label.setText("Card brand is valid");
                        }
                        waits(1);

                        text.setText("");

                        waits(1);
                        checkDigits();

                    }

                });

        cardTypesDD.addActionListener( new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        //where program really starts
                        while (cardTypesDD.getSelectedIndex() == 3) {
                            label.setText("First, please select a card type from DD list");
                        }

                        cardType = (String) cardTypesDD.getSelectedItem();
                        System.out.println(cardType);

                        if (!cardType.equals("")) {
                            label.setText("Thank you, now please enter your card #");
                        }
                        //now go to the jtextfield actionlistener
                    }});
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(
                new Runnable() {
                    public void run() {

                        new CreditGraphics();

                    }});
    }

    public void verifyScreen() {
        //destroy old frame
        frame.dispose();

        //create new frame essentially same as last frame
        vframe = new JFrame("MES Banking App");
        vpanel = new JPanel();
        titlelabel = new JLabel("Verification Page");
        namelabel = new JLabel("Name: ");
        namefield = new JTextField(20);
        //title section
        vpanel.setLayout(new GridBagLayout());
        grid = new GridBagConstraints();
        grid.fill = GridBagConstraints.PAGE_START;
        grid.weightx = 0;
        grid.gridx = 0;
        grid.gridy = 0;
        vpanel.add(titlelabel, grid);

        //name section
        grid.gridy = 1;
        grid.insets = new Insets(10, 0, 0, 0);
        vpanel.add(namelabel, grid);
        grid.gridx = 1;
        grid.insets = new Insets(10, 10, 0, 0);
        vpanel.add(namefield, grid);

        vframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        vframe.getContentPane().add(vpanel);

        vframe.pack();
        vframe.setVisible(true);
    }

    public static void waits(int k) {
        long time0, time1;
        time0 = System.currentTimeMillis();
        do {
            time1 = System.currentTimeMillis();
        } while ((time1 - time0) < k * 1000);
    }

    public void validateCard() {
        //check brand

        cardValid = false;
        if ((cardType.equals("Visa") && carddigits.substring(0, 1).equals("4")) && (length == 13 || length == 16)) {
            label.setText("Thank you, next step");

            cardValid = true;
        }

        if ((cardType.equals("Master Card")) && (carddigits.substring(0, 2).equals("51") || carddigits.substring(0, 2).equals("52") || carddigits.substring(0, 2).equals("53") || carddigits.substring(0, 2).equals("54") || carddigits.substring(0, 2).equals("55")) && (length == 16)) {
            label.setText("Thank you, next step");
            cardValid = true;
        }

        if ((cardType.equals("American Express") && carddigits.substring(0, 2).equals("37") && length == 15)) {
            label.setText("Thank you, next step");
            cardValid = true;
        }

        if (cardValid != true) {
            System.out.println("ERROR");
            label.setText("ERROR");
            waits(2);
            System.exit(0);
        }
        //end check
    }

    public void checkDigits() {
        label.setText("Checking digits using Luhn's algorithm...");
        waits(2);
        //check digits
        checkDigits = new int[length];
        for (int i = 0; i < length; i++) {
            checkDigits[i] = Integer.parseInt(carddigits.substring(i, i + 1));

            //successfully puts digits into array
        }
        for (int e = length - 2; e >= 0; e -= 2) {
            checkDigits[e] = 2 * checkDigits[e];
        }
        for (int d = 0; d < length; d++) {
            holdDigitsChar.add(String.valueOf(checkDigits[d]));
        }
        for (int v = 0; v < length; v++) {
            if (holdDigitsChar.get(v).length() == 2) {
                holdDigits.add(Integer.parseInt(holdDigitsChar.get(v).substring(0, 1)));
                holdDigits.add(Integer.parseInt(holdDigitsChar.get(v).substring(1, 2)));
            } else {
                holdDigits.add(Integer.parseInt(holdDigitsChar.get(v)));
            }
        }

        for (int c = 0; c < holdDigits.size(); c++) {
            checkSum += holdDigits.get(c);
        }

        System.out.println("Check sum:" + checkSum);

        if (checkSum % 10 == 0) {
            label.setText("Numbers check out, thank you");
            waits(2);
            verifyScreen();
        } else {
            System.out.println("ERROR");
            System.exit(0);
        }
    }
}

如果您使用集合或其他没有泛型参数的泛型对象,通常会出现这种情况。例如:

List l = new ArrayList();

vs.

List<String> l = new ArrayList<>(); //or new ArrayList<String>(); in Java < 7

这意味着 Java 编译器无法保证您以类型安全的方式使用这些集合。例如,你应该推一个String and an Integer进入ArrayList在第一个场景中。在某个时刻,当您将其拉出时,您很可能会尝试施放Integer实例化为String,这将导致ClassCastException。当然,你也可以是really, really,小心,不要这样做,但编译器只是提醒您一个事实,即无法保证该列表中的内容。

要消除此警告,请使用第二种实例化方法。如果你是sure你可以摆脱这个(在某些情况下这是可能的,因为你可以确定集合将包含什么)你可以使用@SuppressWarnings("unchecked")注解。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我的编译器告诉我正在使用不安全或未经检查的操作时,这意味着什么? 的相关文章

  • Java Try Catch Final 没有 Catch 的情况下会阻塞

    我正在审查一些新代码 该程序只有一个 try 和一个 finally 块 既然排除了 catch 块 那么如果 try 块遇到异常或任何可抛出的内容 它如何工作 它直接进入finally块吗 如果 try 块中的任何代码可以引发已检查异常
  • 禁用 Eclipse Java 调试器的热代码替换 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Eclipse 中禁用热代码替换 https stackoverflow com questions 2594408 how do i disable hot code replace in
  • Spring安全“记住我”cookie在第一个请求中不可用

    我无法在登录请求后检索 Spring 记住我 cookie 但它在对受保护页面的下一个请求中工作正常 谁能告诉我怎样才能立即得到它 我在登录请求中设置了记住我的 cookie 但在 Spring 重定向回原始 受保护的 url 后无法检索它
  • eclipse中导入项目文件夹图标

    我在 Eclipse 工作区中新导入的 Maven 项目有J and M项目文件夹顶部的图标 项目和包资源管理器 而其他导入的 Maven 项目只有一个J icon 有人可以解释其中的区别吗 该项目有J装饰器被称为 Java 项目和具有M装
  • Firestore - RecycleView - 图像持有者

    我不知道如何编写图像的支架 我已经设置了 2 个文本 但我不知道图像的支架应该是什么样子 你能帮我告诉我图像的文字应该是什么样子才能正确显示吗 holder artistImage setImageResource model getArt
  • 主线程如何在该线程之前运行?

    我有以下代码 public class Derived implements Runnable private int num public synchronized void setA int num try Thread sleep 1
  • 如何将 android.net.Uri 转换为 java.net.URL? [复制]

    这个问题在这里已经有答案了 有没有办法从Uri to URL 我正在使用的库需要这个 它only接受一个URL但我需要在我的设备上使用图像 如果该方案的Uri is http or https new URL uri toString 应该
  • Java:正则表达式排除空值

    在问题中here https stackoverflow com questions 51359056 java regexp for a separated group of digits 我得到了正则表达式来匹配 1 到 99 之间的一
  • Java 服务器-客户端 readLine() 方法

    我有一个客户端类和一个服务器类 如果客户端向服务器发送消息 服务器会将响应发送回客户端 然后客户端将打印它收到的所有消息 例如 如果客户端向服务器发送 A 则服务器将向客户端发送响应 1111 所以我在客户端类中使用 readLine 从服
  • 将表值参数与 SQL Server JDBC 结合使用

    任何人都可以提供一些有关如何将表值参数 TVP 与 SQL Server JDBC 一起使用的指导吗 我使用的是微软提供的6 0版本的SQL Server驱动程序 我已经查看了官方文档 https msdn microsoft com en
  • 隐式超级构造函数 Person() 未定义。必须显式调用另一个构造函数?

    我正在开发一个项目 但收到错误 隐式超级构造函数 Person 未定义 必须显式调用另一个构造函数 我不太明白它 这是我的人物课程 public class Person public Person String name double D
  • Java - 返回值是否会中断循环?

    我正在编写一些基本上遵循以下格式的代码 public static boolean isIncluded E element Node
  • 如何记录来自 Akka (Java) 的所有传入消息

    在 Scala 中 您可以使用 LoggingReceive 包装接收函数 如何通过 Java API 实现相同的目标 def receive LoggingReceive case x do something Scala API 有Lo
  • Dispatcher-servlet 无法映射到 websocket 请求

    我正在开发一个以Spring为主要框架的Java web应用程序 特别使用Spring core Spring mvc Spring security Spring data Spring websocket 像这样在 Spring 上下文
  • 如何在 Eclipse Java 动态 Web 项目中使用 .properties 文件?

    我正在 Eclipse 中开发动态 Web 项目 我创建了一个 properties 文件来存储数据库详细信息 用户名 密码等 我通过右键单击项目和 New gt File 添加它 我使用了Java util包Properties类 但它不
  • ARM NEON 矢量化失败

    我想在 ARM cortex a9 上启用 NEON 矢量化 但在编译时得到以下输出 未矢量化 不支持相关 stmt D 14140 82 D 14143 77 D 14141 81 这是我的循环 void my mul float32 t
  • 哪个集合更适合存储多维数组中的数据?

    我有一个multi dimensional array of string 我愿意将其转换为某种集合类型 以便我可以根据自己的意愿添加 删除和插入元素 在数组中 我无法删除特定位置的元素 我需要这样的集合 我可以在其中删除特定位置的数据 也
  • JSON 到 hashmap (杰克逊)

    我想将 JSON 转换为 HashMapJackson http jackson codehaus org 这是我的 JSON String json Opleidingen name Bijz trajecten zorg en welz
  • 在android中跟踪FTP上传数据?

    我有一个运行 Android 的 FTP 系统 但我希望能够在上传时跟踪字节 这样我就可以在上传过程中更新进度条 安卓可以实现这个功能吗 现在 我正在使用org apache common net ftp我正在使用的代码如下 另外 我在 A
  • JAXB - 列表<可序列化>?

    我使用 xjc 制作了一些课程 public class MyType XmlElementRefs XmlElementRef name MyInnerType type JAXBElement class required false

随机推荐