依赖默认编码

Reliance on default encoding

我正在使用 FindBugs,但此错误不断产生:

Reliance on default encoding:

Found a call to a method which will perform a byte to String (or String to byte) conversion, and will assume that the default platform encoding is suitable. This will cause the application behavior to vary between platforms. Use an alternative API and specify a charset name or Charset object explicitly.

我认为这与扫描仪有关,这是我的代码:

package mystack;

 import java.util.*;
  
  public class MyStack {
   
    private int maxSize;
    private int[] stackArray;
    private int top;
    
    public MyStack(int s) {
       maxSize = s;
       stackArray = new int[maxSize];
       top = -1;
    }
    public void push(int j) {
       stackArray[++top] = j;
    }
    public int pop() {
       return stackArray[top--];
    }
    public int peek() {
       return stackArray[top];
    }
    public int min() {
       return stackArray[0];
    }
    public boolean isEmpty() {
       return (top == -1);
    }
    public boolean isFull() {
       return (top == maxSize - 1);
    }
     
    
     public static void main(String[] args) {
         
       Scanner read = new Scanner(System.in);

         char end;
         
         System.out.println("Please enter the size of the Stack: ");
            int size=read.nextInt();
        
            MyStack stack = new MyStack(size);
         
         do{
         
            if(stack.isEmpty()){
              System.out.println("Please fill the Stack: (PUSH) \nBecause Stack is Empty.");
                 int add;
                 for(int i=0; i<size; i++)
                 {add=read.nextInt();
                   stack.push(add);}
                      }//End of if
        
          else if(stack.isFull()){
              System.out.println("Do you want to 1)POP 2)Know the Peek 3)Know the Min");
               int option=read.nextInt();
                if(option==1) 
                 stack.pop();
                
                else if (option==2)
                 System.out.println("The Peek= "+stack.peek());
                
                else if (option==3)
                 System.out.println("The Min= "+stack.min());
                
                else System.out.println("Error, Choose 1 or 2 or 3");
                      }//End of if
         else 
            { System.out.println("Do you want to 1)POP 2)Know the Peek 3)Know the Min 4)PUSH");
               int option=read.nextInt();
                 
                 if(option==1)
                     stack.pop();
                
                 else if (option==2)
                  System.out.println("The Peek= "+stack.peek());
                 
                 else if (option==3)
                  System.out.println("The Min= "+stack.min());
               
                 else if(option==4)
                   {int add=read.nextInt();
                    stack.push(add);}
                   }//end else
        
         System.out.print("Stack= ");
          for(int i=0; i<=stack.top; i++)
                 { System.out.print(stack.stackArray[i]+" ");}
         
         System.out.println();
         System.out.println();
         
         System.out.println("Repeat? (e=exit)");
          end=read.next().charAt(0);
          
         System.out.println();
         }while(end!='e');   
    System.out.println("End Of Program");
    }//end main

    }//end MyStack

显然是一个堆栈,工作正常。

FindBugs 担心默认字符编码。如果你在 Windows 下,你的默认字符编码可能是 "ISO-8859-1"。如果您未满 Linux,则可能是 "UTF-8"。如果您使用的是 MacOS,您可能正在使用 "MacRoman"。您可能希望通过单击链接阅读有关 charset encodings and find out more on available encodings in Java 的更多信息。

特别是,此行使用默认平台编码从控制台读取文本:

   Scanner read = new Scanner(System.in);

为确保代码在不同环境下工作相同,FindBugs 建议您将此更改为

   Scanner read = new Scanner(System.in, "UTF-8");

(或您最喜欢的编码)。这将保证,给定一个使用编码 "UTF-8" 的输入文件,无论您在哪台机器上执行程序,它都将以相同的方式被解析。

对于您的情况,您可以安全地忽略此警告,除非您有兴趣将文本文件输入到您的应用程序中。

FindBugs 检测到您的 Scanner 对象使用默认编码来解析 InputStream。通常,最好将编码显式设置为 new Scanner(someInputStreamFromFile, "UTF-8") 以在不同环境中具有相同的解析结果。但在你的情况下不是,因为你阅读 System.io 并且没有可靠的方法来检测控制台编码。在此处查看详细信息:java console charset translation.

当您从控制台读取时,您可以 ignore this warning:

@SuppressFBWarnings(
        value = "DM_DEFAULT_ENCODING",
        justification = "It's fine for console reads to rely on default encoding")

这种压制应该是有意识的。在某些情况下,我们可能会使用例如Windows 中的 UTF-8 控制台,然后我们不应该依赖 new Scanner(System.in); 中的默认编码。