【问题标题】:Is this a safe programming practice?这是一种安全的编程习惯吗?
【发布时间】:2015-07-10 13:48:44
【问题描述】:
import java.util.*;

class Test{
    private int intToken;       
    public Test(){
        intToken = 0;          
    }
    // A method that returns the last character of a String
    // This here returns a string regardless of input
    public String lastChar(String tok){
        String token = String.valueOf(tok);
        String strToken = token.substring(token.length()-1);
        return strToken;
    }
    public static void main(String[]args){
        Test test = new Test();
        Scanner scan = new Scanner(System.in);
        System.out.println("Enter a number to get its last number");
        String value = scan.nextLine();
        System.out.println(test.lastChar(value));  
    }
}

上述方法lastChar() 的代码适用于Integer 和String。由于我正在练习编程,我真的很想创建一个返回 StringInteger 的单一方法,但在该方法中我想检测输入是 Integer 还是 String

在方法创建之后,我首先尝试了

Scanner scan = new Scanner(tok);
scan.hasNextInt(); 

即使tok 中有int,也会返回false

我也试过了

tok.contains("0,1,2,3,4,5,6,7,8,9"); 

即使tok 中有int,它也返回false。我还没有研究char 类型。但我注意到tok.contains("1"); 返回了true

我想使用boolean 结果为StringInteger 创建单独的处理程序。到目前为止,代码有效。

现在我的问题是使用单一方法是否安全或良好 lastChar(),或者我应该定义两个单独的方法lastInt()lastStr()

【问题讨论】:

  • 数字有数字(即一位数字)。在内部,它们不存储在 base-10 中,因此您必须将它们转换为 base-10 才能获得最后一位。
  • 我希望我能清楚地理解这意味着什么。但是举个例子希望肯定会增加我的知识。我试图从一堆字符中获取最后一个字符,包括数字、int、控制字符等。

标签: java string int


【解决方案1】:

我想知道String的值是不是整数(比如“1234”),可以尝试转换String:如果有异常String的值不是整数:

try{
   Integer.parseInt(tok);
   return true;
} catch(NumberFormatException ex) {
   return false;
}

【讨论】:

  • 以这种方式使用异常是不好的做法——异常非常慢。最好在尝试解析字符串之前检查字符串是否只包含数字。或者编写自己的整数解析器(不难),可以优雅地处理非整数字符串。
  • 字符串与 int 混合的情况如何? ,你不会知道它是纯 int 还是主要是 Strings。我想要实现的是测试tok中是否有int,然后我将它视为一个String,并测试是否有任何特殊字符是int以外的字母,如果它返回false,那么我会把它当作一个int
  • 这是非常低效的,因为多个输入会减慢整个过程,为什么要投票?
  • @rossum: 有趣...我可以使用正则表达式检查或检查字符串中的每个字符...但是如果字符串包含所有数字但它太长而无法容纳 int/Integer ?
  • 您可以轻松查看String参数的长度。短字符串直接转换为int。对于较长的字符串,将其转换为long,然后检查它是否为<= Integer.MAX_VALUE。如果字符串对于任何可能的整数来说都太大了,那么对非整数字符串采取任何你想要的操作。
【解决方案2】:
Scanner scan = new Scanner("tok');

这应该是单引号或双引号,而不是两者

另外hasNextInt() 定义下一个扫描器令牌是否为int,当然它会返回false,因为您的输入没有int

tok.contains("1"); 

这是检查它是否包含字符串“1”而不是数字 1

您的方法返回一个字符串,而不是一个字符串和一个整数。即使您输入“1”,它也会被视为字符串

您应该了解更多关于方法及其返回的内容

How to check the input is an integer or not JAVA?

您始终可以测试输入并使用 NumberFormatException 或 MismatchInputException

【讨论】:

  • 将定义多个 int 说 int one = 1;整数二 = 2;并将它们传递给 tok,包含(一,二);工作?因为 tok.contains(0,1,2.3,4 等 9);不工作
  • 请阅读String contains()方法的apidocs.oracle.com/javase/7/docs/api/java/lang/…
【解决方案3】:

andynaz 和 Huang Chen 的答案的一点补充
为了防止基于捕获的编程,鼓励使用谷歌Guava Library
在你的图书馆里 Ints.tryParse(String str)
如果 str 无法解析,则返回 null
以及从 str 解析的 Integer 否则

希望这能回答你的问题

【讨论】:

    【解决方案4】:

    看看https://docs.oracle.com/javase/tutorial/java/data/index.html 它讨论了Java中数字和字符串之间的区别。如果要返回两种不同的数据类型,肯定需要两种方法。

    【讨论】:

      【解决方案5】:

      如果您正在练习编程,您可以遍历字符串中的字符并通过Character class 检测其中是否为数字

          String x = getString();
          boolean hasNonDigits = false;
          for(char c : x.toCharArray()){
              if(!Character.isDigit(c)){
                  hasNonDigits = true;
                  break;
              }
          }
          if(hasNonDigits){
              // It's not an integer
          }
      

      但如果您正在寻找更传统的方式,请使用带有 Pattern 的正则表达式

          Pattern p = Pattern.compile("\\D");
          String x = getString();
          boolean isInteger = !p.matcher(x).find();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-16
        • 1970-01-01
        • 1970-01-01
        • 2020-09-16
        • 1970-01-01
        • 2015-07-18
        • 1970-01-01
        相关资源
        最近更新 更多