小编Kli*_*cou的帖子

可以从System.ArgumentException派生吗?

如果我有一个方法来检查其参数的有效性,是否可以抛出我自己的自定义异常System.ArgumentException?我在问,因为ArgumentException它本身是从中衍生而来的System.SystemException,我看到关于应用程序是否应该派生出来的指导方针存在冲突SystemException.(虽然是间接的,ArgumentException但仍然等于衍生出来SystemException.)

我看到许多指南说不是从中派生出来的ApplicationException,而是从Exception派生出来的.我很高兴.我不确定的是,是否也可以从SystemException派生.

如果我不应该从中派生SystemException,那么我应该从中派生出什么"invalid argument"异常类?

c# exception

39
推荐指数
3
解决办法
1440
查看次数

接口不能声明类型

我在API中有一个抽象类,由另一个程序集中的方法使用.该类在其中定义了嵌套枚举,有点像这样:

abstract public class Thing
{
    public enum Status { Accepted, Denied, Pending };
    abstract public Status status { get; private set; }
    etc...
}
Run Code Online (Sandbox Code Playgroud)

然后我决定如果Thing是一个界面,那将是一个更好的设计.但我不能这样做:

public interface Thing
{
    enum Status { Accepted, Denied, Pending };
    Status status { get; }
    etc...
}
Run Code Online (Sandbox Code Playgroud)

这会产生错误消息"接口无法声明类型".但是,如果我在接口之外移动枚举的定义,首先我要打破封装(Status类型真的属于Thing并且本身没有意义)更重要的是我必须去修改代码使用它的许多其他程序集.你能想到任何解决方案吗?

c#

14
推荐指数
2
解决办法
1万
查看次数

创建长度为N的新数组的最快方法,并通过重复给定数组来填充它

我想分配一个长度为N的新数组,并通过重复给定的数组来填充它.界面如下所示:

<T> T[] repeat(T[] array, int n);
Run Code Online (Sandbox Code Playgroud)

澄清我的意思是一个小例子:

String a = {"a", "b", "c"};
//     b = {"a", "b", "c", "a", "b", "c", "a", "b", "c", "a"}
String b = repeat(a, 10); 
Run Code Online (Sandbox Code Playgroud)

大多数程序员将提出以下解决方案(为了简化数组生成,选择了特定类型):

public String[] repeat(String[] array, int n) {
  String[] repeated = new String[n];
  for (int i = 0; i < n; i++) {
    repeated[i] = array[i % array.length];
  }
  return repeated;
}
Run Code Online (Sandbox Code Playgroud)

有更快的方法吗?

java arrays performance repeat

13
推荐指数
1
解决办法
408
查看次数

String.substring()生成基础char []值的副本

有关性能考虑因素的问题String.substring.在Java 1.7.0_06之前,该String.substring()方法返回一个新String对象,该对象与其父对象共享相同的底层char数组,但具有不同的偏移量和长度.为了避免在只需要保留一个小子字符串时在内存中保留一个非常大的字符串,程序员习惯于编写如下代码:

s = new String(queryReturningHugeHugeString().substring(0,3));
Run Code Online (Sandbox Code Playgroud)

从1.7.0_06开始,没有必要创建一个新的,String因为在Oracle的实现中String,子串不再共享它们的底层char数组.

我的问题是:我们可以依赖Oracle(以及其他供应商)不再回到char[]未来的版本中共享,而只是这样做s = s.substr(...),或者我们是否应该显式创建一个新的String,以防JRE的未来版本开始使用共享实现再次?

java string

12
推荐指数
1
解决办法
2071
查看次数

Intellij IDEA中的Java 11 JShell

我有Java 11 JDK和IntelliJ IDEA 2018.2.4(64位).当我使用Java 10.0.2时,IntelliJ IDEA中的JShell控制台工作正常.现在我已升级到Java 11,JShell控制台已停止工作.单击"运行"按钮或按Ctrl + Enter(参见屏幕截图)时,什么都没发生.

我的项目使用Java 11编译和运行很好 - 它只是JShell控制台不起作用.(此外,JShell在命令提示符下运行正常,它只在IDEA内部无效.)我可以在两台机器上重现这个问题,一台在家运行IDEA Community Edition 2018.2.4,另一台在运行Ultimate 2018.2的工作0.3.

我需要做一些配置来解决这个问题吗?

截图

java intellij-idea jshell java-11

12
推荐指数
1
解决办法
2457
查看次数

什么是"Java标识符中可忽略的字符"

我偶然发现了这个文档,并想知道这是什么.显然,您可以在标识符中包含某些控制字符,并忽略它们:

public static void main(String[] args) throws Exception {
    int dummy = 123;
    System.out.println(d?ummy); // Has U+200B after the `d` before the `u`
}
Run Code Online (Sandbox Code Playgroud)

我在JLS中找不到任何相关内容.IntelliJ IDEA在编辑器中给出一个错误,称"dummy"是一个未声明的标识符(但它编译并运行).我猜这是IntelliJ中的一个错误?这些"可忽视的角色"的目的是什么?

(注意:StackOverflow似乎从问题中删除了我的控制字符)

java intellij-idea

10
推荐指数
1
解决办法
321
查看次数

Kotlin 值类与内联类有何不同?

内联类和值类有什么区别?我知道,当值类被注释为时,它就是一个内联类,@JvmInline value class但这仅适用于针对 JVM 的情况。那么在其他平台上,所有值类都是隐式内联类吗?@JvmInline到底什么是非内联值类,不在JVM 上定义值类有什么用?

kotlin

10
推荐指数
1
解决办法
1748
查看次数

DELETE_ON_CLOSE的用处

互联网上有很多例子显示如何使用StandardOpenOption.DELETE_ON_CLOSE,例如:

Files.write(myTempFile, ..., StandardOpenOption.DELETE_ON_CLOSE);
Run Code Online (Sandbox Code Playgroud)

其他示例类似地使用Files.newOutputStream(..., StandardOpenOption.DELETE_ON_CLOSE).

我怀疑所有这些例子都可能存在缺陷.写一个文件的目的是你要在某个时候读回来; 否则,为什么还要写呢?但是,在您有机会阅读之前,DELETE_ON_CLOSE会不会导致文件被删除?

如果你创建一个工作文件(用于处理太大而无法保留在内存中的大量数据),那么你不会使用RandomAccessFile它,它允许读写访问吗?但是,RandomAccessFile据我所知,并没有为您提供指定DELETE_ON_CLOSE的选项.

那么有人能告诉我DELETE_ON_CLOSE 实际上有用吗?

java nio

9
推荐指数
1
解决办法
1398
查看次数

java System.getenv环境名称以"="开头

我注意到Windows上的Java环境(通过System.getenv()调用获得)包含一些在真实环境中不存在的变量.这些以&equals-sign开头并包含"= ExitCode",它映射到在此java invokation之前运行的进程的退出代码; 以及各种驱动器号的默认目录,例如"= C:","= D:".在所有Windows版本上运行的所有Sun Java版本似乎都是这种情况.这是在任何地方记录的,还是纯粹仅供Sun内部使用?

编辑 这是一个简单的示例应用程序来显示我的意思.在命令行上编译并运行它:

import java.util.Map;
class ShowEnv {
    public static void main(String[] args) {
        for (Map.Entry v : System.getenv().entrySet())
            System.out.printf("%-23s= %.54s%n", v.getKey(), v.getValue());
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将变量与SET命令(来自cmd.exe)或用C编写的类似命令行程序进行比较.您将发现以=开头的变量不存在于:

=ExitCode              = 00000000
=::                    = ::\
=C:                    = C:\Temp

这些变量显然是在执行JVM期间添加的.

java environment-variables

8
推荐指数
1
解决办法
809
查看次数

Java deleteOnExit和addShutdownHook - 哪个先来?

我有一些临时文件,我打电话deleteOnExit()给.我也有一个可以运行的runnable,addShutdownHook()可以在System.exit调用时运行.

我的关机挂钩运行时是否保证临时文件仍然可用?

java shutdown-hook java-io

7
推荐指数
1
解决办法
311
查看次数