为方法参数分配新值是否有问题?

Eclipse有一个选项来警告赋值给方法的参数(在方法内),如: public void doFoo(int a){ if (a<0){ a=0; // this will generate a warning } // do stuff } 通常我尝试激活(并注意)几乎所有可用的编译器警告,但在这种情况下,我不确定它是否值得。 我看到了改变方法中参数的合法情况(例如:允许参数“取消设置”(例如null)并自动替换默认值),但很少会导致问题,除非它可能有点混淆在方法中间重新分配参数。 你使用这样的警告吗? 为什么/为什么不呢? 注意: 避免这种警告当然等同于使方法参数final (只有这是编译器错误:-))。 所以这个问题为什么我应该在Java中的方法参数上使用关键字“final”? 可能是相关的。

在Java中加载原始的64字节长ECDSA公钥

我有一个原始(r,s)格式的ECDSA NIST P-256公钥。 似乎没有简单的方法将它加载到实现java.security.interfaces.ECPublicKey的对象中。 加载64字节公钥的最简洁方法是什么,以便可以用来检查签名?

JAXB:如何解组不同类型但具有共同父级的对象列表?

我们的应用程序中有一个相当常见的模式。 我们在Xml中配置一个对象的集合(或列表),它们都实现了一个公共接口。 在启动时,应用程序读取Xml并使用JAXB创建/配置对象列表。 我从未想过(经过多次阅读各种post后)只使用JAXB的“正确方法”。 例如,我们有一个接口Fee ,以及具有一些共同属性的多个具体实现类,以及一些不同的属性和非常不同的行为。 我们用来配置应用程序使用的费用列表的Xml是: NYSE … 在上面的Xml中,每个元素对应于Fee接口的具体子类。 type属性提供有关要实例化的type信息,然后一旦实例化,JAXB解组将应用剩余Xml中的属性。 我总是不得不采取这样的行动: private void addFees(TradeFeeCalculator calculator) throws Exception { NodeList feeElements = configDocument.getElementsByTagName(“fee”); for (int i = 0; i < feeElements.getLength(); i++) { Element feeElement = (Element) feeElements.item(i); TradeFee fee = createFee(feeElement); calculator.add(fee); } } private TradeFee createFee(Element feeElement) { try { String type = […]

Java日期validation

我需要validation用户输入为有效日期。 用户可以输入dd / mm / yyyy或mm / yyyy(两者都有效) validation我正在做的事情 try{ GregorianCalendar cal = new GregorianCalendar(); cal.setLenient(false); String []userDate = uDate.split(“/”); if(userDate.length == 3){ cal.set(Calendar.YEAR, Integer.parseInt(userDate[2])); cal.set(Calendar.MONTH, Integer.parseInt(userDate[1])); cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(userDate[0])); cal.getTime(); }else if(userDate.length == 2){ cal.set(Calendar.YEAR, Integer.parseInt(userDate[1])); cal.set(Calendar.MONTH, Integer.parseInt(userDate[0])); cal.getTime(); }else{ // invalid date } }catch(Exception e){ //Invalid date } 因为GregorianCalendar从0开始,30/01/2009或12/2009开始给出错误。 任何建议如何解决这个问题。

运行由shade插件构建的独立应用程序时找不到Log4j2配置

我有应用程序,当我从maven log4j2运行时它正在工作: mvn exec:java -Dexec.args=… 但是当我将jar作为独立应用程序运行时,它会显示错误: java -jar 日志: ERROR StatusLogger Unrecognized format specifier [d] ERROR StatusLogger Unrecognized conversion specifier [d] starting at position 16 in conversion pattern. ERROR StatusLogger Unrecognized format specifier [thread] ERROR StatusLogger Unrecognized conversion specifier [thread] starting at position 25 in conversion pattern. ERROR StatusLogger Unrecognized format specifier [level] ERROR StatusLogger […]

为API选择CharSequence和String之间

String 是一个 CharSequence 。 Java库中的许多方法都接受CharSequence因此它们更 CharSequence 。 有些classe有一个String方法(例如, Writer.write(String) ),并且还使用等效的CharSequence方法实现Appendable (例如, Writer.append(CharSequence) )。 如果我正在编写一个委托给这样一个类的类,并且需要一些文本输入,我可以选择该输入为String或CharSequence 。 通过为客户提供更多选项,选择后者使课程更加灵活。 但我没有看到太多代码这样做:文本参数几乎总是一个String而不是一个CharSequence 。 使用CharSequence吗? 是否有性能受损? 或者只是程序员的intertia或无知会导致使用String而不是CharSequence ? 比较 class XMLWriter { private final Writer writer; // more stuff here public void writeComment(String text) { writer.write(“”); } } 同 class XMLWriter { private final Writer writer; // more stuff here public […]

jacoco代码覆盖率报告生成器显示错误:“包中的类”代码覆盖率报告’与执行数据不匹配“

我使用jacoco:report标签生成jacoco报告。 我收到的错误如下: [jacoco:report] Classes in bundle ‘Code Coverage Report’ do no match with execution data. For report generation the same class files must be used as at runtime. [jacoco:report] Execution data for class xxxxx does not match. [jacoco:report] Execution data for class yyyyy does not match. ant报告目标如下: 这样生成的./code/src只能使用./code/src 。 那么为什么会出现这样的错误呢。 任何想法?

关闭BufferedReader / PrintWriter会关闭套接字连接吗?

我有一个应用程序,它使用简单的套接字在两个系统之间传递一些字符。 我把我的java应用程序作为服务器运行。 我建立一个连接很好,甚至传递一条消息。 但是,在发送一条消息后,我的连接关闭。 从我可以看出,似乎在关闭printWriter和bufferedReader ,套接字本身正在关闭?! 这很糟糕,因为我有多条消息要在同一个连接上发送。 printWriter = new PrintWriter(theServer.getClientSocket().getOutputStream()); bufferedReader = new BufferedReader(new InputStreamReader(theServer.getClientSocket().getInputStream())); printWriter.println(“the line”); printWriter.close(); //Closing on these lines? bufferedReader.close(); //Closing on these lines? 我满满的吗? 如何在Java中维护此连接?

transformer.setOutputProperty(OutputKeys.ENCODING,“UTF-8”)不起作用

我有以下方法将XMLDom写入流: public void writeToOutputStream(Document fDoc, OutputStream out) throws Exception { fDoc.setXmlStandalone(true); DOMSource docSource = new DOMSource(fDoc); Transformer transformer = TransformerFactory.newInstance().newTransformer(); transformer.setOutputProperty(OutputKeys.METHOD, “xml”); transformer.setOutputProperty(OutputKeys.ENCODING, “UTF-8”); transformer.setOutputProperty(OutputKeys.INDENT, “no”); transformer.transform(docSource, new StreamResult(out)); } 我正在测试其他一些XMLfunction,这只是我用来写入文件的方法。 我的测试程序生成了33个测试用例,其中写出了文件。 其中28个具有以下标题: … 但出于某种原因,现在有一个测试用例产生: … 还有四种产品: … 您可以清楚地看到,我将ENCODING输出键设置为UTF-8。 这些测试曾用于早期版本的Java。 我没有在一段时间内(超过一年)运行测试,但今天在“Java(TM)SE运行时环境(版本1.6.0_22-b04)”上运行我得到了这个有趣的行为。 我已经validation导致问题的文档是从最初具有这些编码的文件中读取的。 似乎新版本的库试图保留已读取的源文件的编码。 但这不是我想要的……我真的希望输出是UTF-8。 有没有人知道可能导致变压器忽略UTF-8编码设置的任何其他因素? 还有什么必须在文档上设置,以忘记最初读取的文件的编码? 更新: 我在另一台机器上检查了同一个项目,在那里构建并运行了测试。 在那台机器上,所有测试都通过了! 所有文件的标题中都有“UTF-8”。 该机器具有“Java(TM)SE运行时环境(版本1.6.0_29-b11)”两台机器都运行Windows 7.在新机器上运行正常,jdk1.5.0_11用于进行构建,但是在旧机器上运行机器jdk1.6.0_26用于构建。 用于两个版本的库完全相同。 在构建时是否可以与1.5的JDK 1.6不兼容? […]

自动装箱的性能影响

通常,编译器会生成执行装箱和拆箱的代码。 但是如果不需要盒装值,编译器会是什么? (Oracle标准)编译器是否足够智能以优化它? 看看这个方法: public static void requireInRange(int index, Object[] array) { if(index = array.length) throw new IndexOutOfBoundsException(); } 唯一相关的信息是array.length ,因此例如,将数组的每个值包装起来是没用的。 喜欢这段代码: int[] anArray = {3, 4, 2}; requireInRange(3, anArray); 编译器是否会实际插入用于装箱数组的每个值的代码?