大部分时间我struct用来保存套接字通信数据结构的所有参数,然后我可以通过传递起始地址及其大小轻松地复制,传递或将整个结构放在套接字上.
如果我struct为一个变量短数组添加一个构造函数,构造函数是否会占用struct中的任何空格?或者我可以struct使用构造函数处理与没有构造函数的构造函数相同struct,并将整个structon 复制到具有其起始地址和大小的套接字,并且其空间仍然是连续分配的?
我有一个不小的多线程应用程序与GUI和套接字通信.在开发过程中,我发现有时会有一些异常没有被捕获和记录.如果有的话,我必须盯着控制台才能得到它们.
有没有办法在一个地方捕获来自不同线程(包括EDT)的未捕获的异常,在main()中说,并记录它们?我在main()中放了一个try-catch 来捕获Throwable,但它不起作用.
编辑:
更具体的,我有Executors.newCachedThreadPool()与Runnable接口秒.我不想在很多情况下使用Callable,因为我不想阻止我的调用线程.那么如何从Runnables中捕获异常?
同时,我怎么能赶上ü ncaught例外,从摇摆EDT?
我有以下程序来测试Java如何处理汉字:
String s3 = "????";
char[] chs = s3.toCharArray();
byte[] bs = s3.getBytes(StandardCharsets.UTF_8);
byte[] bs2 = new String(chs).getBytes(StandardCharsets.UTF_8);
System.out.println("encoding=" + Charset.defaultCharset().name() + ", " + s3 + " char[].length=" + chs.length
+ ", byte[].length=" + bs.length + ", byte[]2.length=" + bs2.length);
Run Code Online (Sandbox Code Playgroud)
打印出来是这样的:
编码=UTF-8,???char[].length=4, byte[].length=12, byte[]2.length=12
结果是这些:
一个汉字取一个char,在Java中为2个字节,ifchar[]用来存放汉字;
一个汉字byte如果byte[]用于容纳汉字需要3s;
我的问题是如果 2 个字节就足够了,为什么我们使用 3 个字节?如果 2 个字节不够,为什么我们使用 2 个字节?
编辑:
我的 JVM 的默认编码设置为 UTF-8。
我在一个类中有以下代码:
class A
{
std::vector<Parameter*> params;
std::vector<Parameter*> getParamVector() {return params;}
void addOneParam(Parameter* param)
{
params.push_back(param);
}
}
Run Code Online (Sandbox Code Playgroud)
在另一个类B类中,我尝试通过执行以下操作将项添加到params向量中:
classA_Ptr->getParamVector().push_back(aParamPtr);
Run Code Online (Sandbox Code Playgroud)
但是在上面调用之后,参数矢量的大小仍为0.
我必须添加上面的addOneParams(Parameter* param)方法来将项添加到params向量中.为什么?
我有一个方法来获取Map的内容作为字符串,如下所示:
public static String toStringStringFloatMap(Map<String, Float> stringFloatMap)
{
String entries = "";
Iterator<Entry<String, Float>> it = stringFloatMap.entrySet().iterator();
while (it.hasNext())
{
Map.Entry<String, Float> pair = it.next();
entries += pair.getKey() + "=" + pair.getValue() + "\n";
}
return entries;
}
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试将其转换为Integer,Short,Double,....的通用版本.我用"?extends Number"替换了所有的Float,但.... entrySet().iterator(); 语句导致编译错误,并告诉我以下内容:
Type mismatch: cannot convert from Iterator<Map.Entry<String,capture#6-of ? extends Number>> to Iterator<Map.Entry<String,? extends Number>>
Run Code Online (Sandbox Code Playgroud)
我不知道"捕获#6-of?extends Number"是什么意思.谁能为我解释一下?
编辑:
正如安迪所指出的那样<?, ?>可能是最好的.
但我的问题仍然是为什么iterator()行无法传递编译器?
public static String toStringMapError(Map<?, ?> map)
{
String entries = "";
Iterator<Entry<?, ?>> it = map.entrySet().iterator(); <<<<<------- …Run Code Online (Sandbox Code Playgroud) 我有以下代码:
System.out.println("(int) (10 * 0.75 / 0.6 + 0.5)=" + (int) (10 * 0.75 / 0.6 + 0.5));
Run Code Online (Sandbox Code Playgroud)
打印出来的是:(10 * 0.75 / 0.6 + 0.5)= 13
还有一个:
int a = 10;
float b = 0.75f;
float c = 0.6f;
System.out.println("(int) (a * b / c + 0.5)=" + (int) (a * b / c + 0.5));
Run Code Online (Sandbox Code Playgroud)
打印出来的是 (a * b / c + 0.5)= 12
为什么它们不同?
编辑:
System.out.println("(int) (10 * 0.75f / 0.6f + 0.5f)=" + (int) (10 * 0.75f …
在ThreadPoolExecutor类中,有一个maxPoolSize来指定最大线程池大小。这意味着如果线程数少于该数量,则池中的线程应立即执行。但是我发现事实并非如此。实际上,它不能超出corePoolSize。我很困惑。如果什么都不做,maxPoolSize的用途是什么?这里是我的测试程序:
我指定了corePoolSize = 2; maxPoolSize = 6; 我创建了5个线程(Runnable)。我认为所有5个线程(可运行)都应同时运行。但他们不是。它们中只有两个正在运行,另外三个则放在一边,直到前两个死亡。
我已经阅读了很多有关该主题的文章。但是没有人能指导我使5个线程同时运行。
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class MyThreadPoolExecutorTest2
{
private List<MyRunnable> myRunnables = new ArrayList<>();
public static void main(String[] args)
{
new MyThreadPoolExecutorTest2().test();
}
public void test()
{
int poolSize = 2;
int maxPoolSize = 6;
int threadPoolKeepAliveTimeInSec = 30;
ExecutorService threadPoolExecutor =
new MySimpleThreadPoolExecutor(poolSize, maxPoolSize, threadPoolKeepAliveTimeInSec);
int numOfThread = 5;
System.out.println("Start thread pool test with corePoolSize=" + poolSize + ", maxPoolSize=" …Run Code Online (Sandbox Code Playgroud) 我正在尝试IntelliJ,看看它在 Java 开发中与Eclipse相比如何。我已经导入了Eclipse代码格式。但 Intellij 仍然给我这种格式:@Override public void run(). 我想要的是这样的:
@Override
public void run()
Run Code Online (Sandbox Code Playgroud)
在网上搜索并尝试了一些设置,没有人适合我。
有人可以帮我解决这个问题吗?
顺便说一句,我不明白为什么 IntelliJ 需要一个插件来具有“保存操作”。通过查看该插件的下载计数,很明显“保存操作”是最需要的功能之一。
这是注释中的代码和结果:
我认为numB2应该是16.7500,numB3 = 16.7500,numB4 = 16.7和numB5 = 16.75.但它们并不像我预期的那样.为什么?
public void testBigDecimal()
{
float num = 16.7499924f;
int digitCount = 4;
MathContext mContext = new MathContext(digitCount, RoundingMode.UP);
BigDecimal numB = new BigDecimal(num, mContext);
System.out.println("16.7499924f with MathContext(precision) of 4 =" + numB.floatValue());// 16.75
numB.setScale(4, RoundingMode.UP);
System.out
.println("16.7499924f with MathContext(precision) of 4 and after setScale of 4 =" + numB.floatValue());// 16.75
BigDecimal numB2 = new BigDecimal(num);
System.out.println("16.7499924f without MathContext(precision =" + numB2.floatValue());// 16.749992
numB2.setScale(4, RoundingMode.UP);
System.out.println("16.7499924f without MathContext(precision) and after setScale of 4 …Run Code Online (Sandbox Code Playgroud)